web-dev-qa-db-fra.com

Laravel 5.5 La sauvegarde de méthode n'existe pas lors de la mise à jour des entrées avec la clé primaire modifiée

Je travaille avec laravel 5.5 pour mettre à jour les entrées. Le problème est après avoir changé la clé primaire 'id', qui est le paquet par défaut elequoent en 'project_id'. L'ajout d'un élément fonctionne bien mais la mise à jour d'un élément ne fonctionne pas correctement. Voici l'erreur que j'obtiens.

La méthode d'enregistrement n'existe pas.

Voici mon modèle.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Project extends Model
{
   protected $primaryKey = 'project_id';
    public function user()
    {
        return $this->belongsTo(User::class);
    }
    public function tasks()
    {
        return $this->hasMany(Task::class);
    }
}

Voici ma fonction de contrôleur.

public function editProject($id){

        $project = Project::where('project_id', $id)->firstOrFail();
        $data = ["project_info" => $project];
        return view('projects.edit')->with($data);
    }
    public function updateProject(Request $request){
        $data = $request->all();
        $validator = Validator::make($data, [
            'project_title' => 'required',
            'project_description' => 'required',
            'project_start_date' => 'required',
            'project_end_date' => 'required',
            'project_status' => 'required',
        ]);

        $response = [];

        if ($validator->fails()){
            $response["errors"] = [$validator->messages()->first()];
            $response["success"] = false;
            return json_encode($response);
        }

        else{
            $project = Project::where("project_id", $request->input('project_id'))->get();
            $project->project_title = $request->project_title;
            $project->user_id = Session::get('user_id');
            $project->project_description = $request->project_description;
            $project->project_start_date = $request->project_start_date;
            $project->project_end_date = $request->project_end_date;
            $project->project_status = $request->project_status;
            $project->save();
            return redirect('/listProjects');
        }
    }
10

L'utilisation de get() renvoie un collection . En dépit du fait que vous transmettez un ID "unique", le project_id, Il renverra toujours une collection - la collection contiendra simplement un élément.

Par la suite, votre code ne fonctionnera pas comme vous l'avez vécu, ou du moins pas sans quelques modifications pour que $project Fasse référence au premier élément de la collection.

C'est une solution rapide, changez simplement ceci:

$project = Project::where("project_id", $request->input('project_id'))->get();

pour ça:

$project = Project::where("project_id", $request->input('project_id'))->first();

En utilisant first(), eloquent retournera le premier élément qui correspond à la requête et retournera réellement l'élément (par opposition à une collection avec un élément) et ainsi vous pouvez directement le modifier et l'enregistrer.

24
James

Voici la solution que j'ai trouvée.

$project_id = $request->input('project_id');
$project = Project::find($project_id);
$project->save();
1

Vous pouvez le trouver en identifiant en utilisant

Project::find($id);

Ou obtenez le premier élément comme James l'a dit:

$project = Project::where("project_id", $request->input('project_id'))->first();
1
Thiago Maciel