web-dev-qa-db-ja.com

Laravel 5.5変更された主キーでエントリを更新するとき、メソッドの保存は存在しません

私はlaravel 5.5を使ってエントリを更新しています。問題はプライマリキー「id」を変更した後です。これはデフォルトのpkを「project_id」に変更します。正常に動作していません。ここに私が得ているエラーがあります。

メソッドsaveは存在しません。

これが私のモデルです。

<?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];
        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

get()を使用すると、 collection が返されます。 「一意の」IDである_project_id_を渡しているにもかかわらず、コレクションを返します。コレクションには1つの要素が含まれているだけです。

その後、あなたのコードは、あなたが経験したように機能しません、または少なくとも_$project_がコレクションの最初の要素を参照するようにするためのいくつかの変更なしでは機能しません。

これは簡単な修正ですが、これを変更するだけです:

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

これに:

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

first()を使用すると、eloquentはクエリに一致する最初の要素を返し、実際に(1つの要素を持つコレクションとは対照的に)要素を返すため、直接編集して保存できます。

24
James

ここに私が見つけた解決策があります。

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

あなたはIDを使用してそれを見つけることができます

Project::find($id);

または、ジェームズが言ったような最初の要素を取得します:

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