【问题标题】:Laravel sync() method errorLaravel sync() 方法错误
【发布时间】:2015-08-03 05:35:16
【问题描述】:

简要说明我所拥有的: 使用名为 project_user 的数据透视表在 projectuser 之间建立 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 循环中。

标签: php html database laravel


【解决方案1】:

您的 $project 是空的,因为您在 foreach 中声明了 $project。 尝试在 foreach 之外声明它。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      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');
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-31
        • 1970-01-01
        • 2018-10-04
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 2014-08-16
        相关资源
        最近更新 更多