Метод сохранения Laravel 5.5 не существует при обновлении записей с измененным первичным ключом


Я работаю с laravel 5.5 для обновления записей. Проблема возникает после изменения первичного ключа "id", который по умолчанию является pk, на "project_id". добавление элемента работает нормально, но обновление элемента работает неправильно. Вот ошибка, которую я получаю.

Метод сохранения не существует.

Вот моя модель.

<?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);
    }
}

Вот моя функция контроллера.

 public function editProject($id){

        $project = Project::where('project_id', $id)->firstOrFail();
        $data = ["project_info" => $project];
        //die(print_r($data));
        return view('projects.edit')->with($data);
    }
    public function updateProject(Request $request){
        //die(print_r($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();
            //die(print_r($project));
            //$project->id = $request->project_id;
            $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');
        }
    }
Author: James, 2017-10-23

2 answers

Использование get() возвращает коллекцию . Несмотря на то, что вы передаете "уникальный" идентификатор, project_id, он все равно вернет коллекцию - в коллекции будет просто один элемент.

Впоследствии ваш код не будет работать так, как вы испытали, или, по крайней мере, не без нескольких изменений, чтобы $project ссылался на первый элемент в коллекции.

Это быстрое решение, просто измените это:

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

К этому:

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

С помощью first(), eloquent вернет первый элемент, соответствующий запросу, и фактически вернет элемент (в отличие от коллекции с одним элементом), чтобы вы могли напрямую редактировать и сохранять его.

 9
Author: James, 2017-10-23 09:22:54

Вот решение, которое я нашел.

$project_id = $request->input('project_id');
$project = Project::find($project_id);
$project->save();
 1
Author: Melaku Minas, 2017-10-25 06:45:38