【发布时间】:2015-08-03 05:35:16
【问题描述】:
简要说明我所拥有的:
使用名为 project_user 的数据透视表在 project 和 user 之间建立 ManyOnMany 关系。
当显示某个项目时,会打印带有复选框的用户列表,因此一旦选中该复选框,他们就会链接到该项目(因此它会将user_id + project_id 发送到pivot table
现在的问题。当我们将用户(例如Admin der Liam)链接到项目时,它将起作用并且数据将被发送到数据库。
但是,当再次取消选中该复选框时,它将给出Call to a member function users() on a non-object 错误,而不是清除表并仅将选中的框放入数据库中
控制器:
public function edit($id, Project $project)
{
$users = User::with('projects')->get();
$project = $this->project->find($id);
return view('project.edit', ['project' => $project, 'id' => 'edit', 'project_id' => $id, 'users' => $users]);
}
public function update(CreateProjectRequest $request)
{
if($request->get('contribute'))
{
foreach($request->get('contribute') as $k => $contribute)
{
if($contribute == 1)
{
$project = $this->project->find($request->project_id);
$keys[] = $k;
}
}
}
$project->users()->sync($keys);
$project = $this->project->find($request->project_id);
$project->fill($request->input())->save();
return redirect('project');
}
HTML/刀片:
@if(isset($users))
@foreach($users as $user)
<tr>
<td>
{{$user->firstname}} {{$user->middlename}} {{$user->lastname}}
</td>
<td>
{!! Form::checkbox('contribute['.$user->id.']', '1', $user->projects->contains($project->id)) !!}
</td>
</tr>
@endforeach
@endif
【问题讨论】:
-
你称之为 $project->users()->sync($keys);在下一行启动 $project 对象之前。这就是为什么 users() 不是成员函数的原因。
-
那么需要进行哪些更改才能使其按预期工作?
-
把$project->users()->sync($keys);在 $project = $this->project->find($request->project_id); 之后在你的 while 循环中。