Laravel 5.5 使用修改后的主键更新条目时不存在方法保存
Laravel 5.5 Method save does not exist when updating entries with modified primary key
我正在与 laravel 5.5 合作更新条目。问题是在更改主键 'id' 之后,这是 elequoent 默认 pk 到 'project_id'。添加项目工作正常,但更新项目工作不正常。这是我收到的错误。
Method save does not exist.
这是我的模型。
<?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');
}
}
使用 get()
return 一个 collection。尽管您传递的是 'unique' ID,project_id
,它仍将是 return 一个集合 - 该集合将只包含一个元素。
随后,您的代码将不会像您所经历的那样工作,或者至少不会在没有一些更改的情况下使 $project
引用集合中的第一个元素。
虽然这是一个快速修复,只需更改此:
$project = Project::where("project_id", $request->input('project_id'))->get();
对此:
$project = Project::where("project_id", $request->input('project_id'))->first();
通过使用 first()
,eloquent 将 return 匹配查询的第一个元素,实际上 return 元素(与只有一个元素的集合相反)这样您就可以直接编辑并保存了。
这是我找到的解决方案。
$project_id = $request->input('project_id');
$project = Project::find($project_id);
$project->save();
您可以使用
通过 id 找到它
Project::find($id);
或者像James说的获取第一个元素:
$project = Project::where("project_id", $request->input('project_id'))->first();
我正在与 laravel 5.5 合作更新条目。问题是在更改主键 'id' 之后,这是 elequoent 默认 pk 到 'project_id'。添加项目工作正常,但更新项目工作不正常。这是我收到的错误。
Method save does not exist.
这是我的模型。
<?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');
}
}
使用 get()
return 一个 collection。尽管您传递的是 'unique' ID,project_id
,它仍将是 return 一个集合 - 该集合将只包含一个元素。
随后,您的代码将不会像您所经历的那样工作,或者至少不会在没有一些更改的情况下使 $project
引用集合中的第一个元素。
虽然这是一个快速修复,只需更改此:
$project = Project::where("project_id", $request->input('project_id'))->get();
对此:
$project = Project::where("project_id", $request->input('project_id'))->first();
通过使用 first()
,eloquent 将 return 匹配查询的第一个元素,实际上 return 元素(与只有一个元素的集合相反)这样您就可以直接编辑并保存了。
这是我找到的解决方案。
$project_id = $request->input('project_id');
$project = Project::find($project_id);
$project->save();
您可以使用
通过 id 找到它Project::find($id);
或者像James说的获取第一个元素:
$project = Project::where("project_id", $request->input('project_id'))->first();