BrownieCoffee
2 months ago
211
3
Laravel

Field 'project_id' doesn't have a default value | pass variable to my custom Trait

Posted 2 months ago by BrownieCoffee

Hi there,

I use a trait to have possibility to call the desired function in controller methods instead of do repetitive code.

I created to trait one for project and one for material

project Trait

trait ProjectTrait
{

    use MaterialTrait;

    public function editProject($project, Request $request, ProjectService $projectService)
    {
        //pour une question de sécurité, je recherche l'utilisateur connecté
        $user = Auth::user();

        $content = $request->content;

        $project_id_number = mt_rand(100000, 999999);

        // je retrouve la catégorie en correspondance avec celle sélectionnée dans le formulaire
        $cat = Category::where('id', $request->category)->firstOrFail('id');

        $difficulty = DifficultyLevel::where('id', $request->difficulty)->firstOrFail('id');

        //je retrouve l'unité de mesure en correspondance avec celle sélectionnée dans le formulaire
        $unity = UnityOfMeasurement::where('id', $request->unity_of_measurement)->firstOrFail('id');

        //j'indique chaque donnée de champs pour les colonnes concernées
        $project_datas = [
            'category_id' => $cat->id, //je donne l'id de la catégorie
            'difficulty_level_id' => $difficulty->id,
            'title' => $request->title,
            'duration' => $request->duration,
            'unity_of_measurement_id' => $unity->id, //je donne l'id de l'unité de mesure
            'budget' => $request->budget,
            'content' => $projectService->transformBase64ToUrl($user, $content, $project_id_number)
        ];

        //si le champs 'thumbnail' contain un fichier
        if ($request->hasFile('thumbnail')) {
            // je stocke ce fichier dans une variable
            $thumbnail = $request->file('thumbnail');

            $projectService->uploadThumbnailToUserProjectFolder($project, $user, $thumbnail);
        }

        //j'édite le projet
        $project->update($project_datas);

        // dd($project);

        $this->editOrCreateMaterial($project, $request);

        return $project;
    }
}

material trait


trait MaterialTrait
{


    public function editOrCreateMaterial($project, Request $request)
    {

        $materials = $project->materials()->get();

        //s'il existe des matériels pour ce projet
        if (isset($materials)) {

            // pour chaque matériel
            foreach ($materials as $key => $project_material) {
                // je récupère chaque champ ayant pour nom d'input 'material' en récupérant au passage l'id du matériel que je vais stocker dans la variable name;
                $name = $request->input('material')[$project_material->id];
                //si le champs du matériel ayant pour id X est null      
                if (is_null($name)) {
                    //je supprime le matériel concerné
                    $project_material->delete();
                    //autrement
                } else {
                    //j'édite le matériel
                    $project_material->update([
                        'name' => $name
                    ]);
                }
            }
        }

        //s'il y a aucune collection matériel pour le projet
        if ($project->materials()->count()  === 0) {
            //je récupère la valeur de l'input matériel
            $materials = $request->material;
            if ($request->has('material')) {

                //pour chaque matériel
                foreach ($materials as $material) {

                    //si le materiel n'a pas de valeur null
                    if ($material !== null) {
                        $project_material = new Material();
                        $project_material->save([
                            'name' => $material,
                            'project_id' => $project->id
                        ]);
                    }
                }
            }
        }
        //par défaut, si j'appuie sur le bouton "ajouter du matériel" et si le nouveau champs ayant pour nom 'new_material' existe
        if ($request->has('new_material')) {
            $newMatInput = $request->input('new_material');
            //pour chacun de ces inputs
            foreach ($newMatInput as $newMaterial) {
                // s'il y a du nouveau matériel dans le champs
                if ($newMaterial) {
                    //je le crée

                    $project_material = new Material();
                    $project_material->save([
                        'name' => $newMaterial,
                        'project_id' => $project->id
                    ]);
                }
            }
        }


        return $project_material;
    }
}

And I finally call the project Trait inside my controller

    public function updateDraft(StoreProject $request, $project, ProjectService $projectService)
    {           
        


        $project = Project::where('status_id', '=', 1)->findOrFail($project);


        $this->editProject($project, $request, $projectService);
}

I can modify my project, but I can't modify my material.

I call material trait function inside my project function but I have this following error Field 'project_id' doesn't have a default value.

Can you help me please? Thank you in advance.

See U+

Please sign in or create an account to participate in this conversation.