2015-05-21 4 views
1

Краткое объяснение того, что у меня есть: ManyOnMany соотношение между project и user с помощью сводной таблицы называется project_user.Laravel синхронизации() ошибка

При показе определенного проекта список пользователей напечатанных с флажками, так что они будут связаны с проектом, как только флажок установлен (так он пошлет user_id + project_id к pivot 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-> пользователей() -> синхронизация ($ ключей); прежде чем вы начнете объект $ 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.

0

Поместите $project->users()->sync($keys); после $project = $this->project->find($request->project_id); в ваш цикл while. Вы должны синхронизировать свой проект $ после того, как вы инициализировали объект.

foreach($request->get('contribute') as $k => $contribute) 
{ 
    if($contribute == 1) 
    { 
     $project = $this->project->find($request->project_id); 
     $keys[] = $k; 
     $project->users()->sync($keys); 
    } 
} 
Смежные вопросы