2015-05-21 55 views
1

什么,我有简短的解释: 使用数据透视表projectuser之间的关系ManyOnManyproject_userLaravel同步()方法错误

当显示某个项目的用户印有复选框的列表,以便他们将尽快复选框被选中链接到项目(所以它会发送user_id + project_idpivot table

enter image description here

现在的问题。当我们让用户(例如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 
+0

你把这个$项目 - >用户() - >同步($键);在下一行中启动$ project对象之前。这就是为什么users()不是成员函数的原因。 –

+0

那么需要改变以使其按预期工作? – Liam

+0

把$ project-> users() - > sync($ keys);在$ project = $ this-> project-> find($ request-> project_id)之后;在你的while循环中。 –

回答

0
public function update(CreateProjectRequest $request) 
{ 
    $this->project = $this->project->find($request->project_id); 
    if($request->get('contribute')) 
    { 
     foreach($request->get('contribute') as $k => $contribute) 
     { 
      if($contribute == 1) 
      { 
       $keys[] = $k; 
      } 
     } 
    } 

    if(isset($keys)) { 
     $this->project->users()->sync($keys); 
    } 
    else { 
     $this->project->users()->detach(); 
    } 

    $this->project = $this->project->find($request->project_id); 
    $this->project->fill($request->input())->save(); 

    return redirect('project'); 
} 
0

你$项目是空的,因为你宣布在foreach $项目。 尝试在foreach之外声明它。

0

$project->users()->sync($keys);放在$project = $this->project->find($request->project_id);之后的while循环中。 您应该在初始化对象后同步$ project。

foreach($request->get('contribute') as $k => $contribute) 
{ 
    if($contribute == 1) 
    { 
     $project = $this->project->find($request->project_id); 
     $keys[] = $k; 
     $project->users()->sync($keys); 
    } 
}