Этот фрагмент кода должен удалять все старые данные из базы данных и добавлять новые (используя sync ())
Теперь у меня есть проект с пользователями, и пользователь может быть связан с проектом с помощью флажка.
Таким образом, флажок установлен, эта функция будет запускаться, но, например, когда я говорю, что user 1 и user 2 проходят через этот fuction, чтобы добавить в pivot table он отправит только user 2 , а user 1 не пройдет, что идет не так?
И когда я добавлю 3 пользователя user 1 , user 2 , user 3 , добавится только user 2 .
контроллер
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); $project->users()->sync(array($k)); } } } $project = $this->project->find($request->project_id); $project->fill($request->input())->save(); return redirect('project'); }
лопасть
@foreach($users as $user) <tr> <td> {{$user->firstname}} {{$user->middlename}} {{$user->lastname}} </td> <td> {!! Form::checkbox('contribute['.$user->id.']', '1', $user->projects->contains('id', $project->id)) !!} </td> </tr> @endforeach
На dd($request->input()); в начале моего метода обновления (с выбором по крайней мере 3 пользователей) это получит взамен:
array:9 [▼ "_method" => "PATCH" "_token" => "0uIZNn6zwZjVKfgE0ckhDULeYda0OaLzKVdUgoM8" "name" => "Dire Straits" "completion_date" => "2015-05-18" "DataTables_Table_0_length" => "10" "contribute" => array:3 [▼ 1 => "1" 3 => "1" 2 => "1" ] "completed" => "1" "active" => "0" "project_id" => "11" ]
Таким образом, user_id будет user_id и => 1 должно быть значением.
Проблема в том, что sync вызывается в loop 3 раза, поэтому каждый раз она синхронизирует одно значение. Вы должны передать массив идентификаторов в sync ex:
$project->users()->sync([1,3,2]);
Или, если вы хотите, вы можете использовать attach при contribute==1 и detach при contribute==0
Или если contribute не возвращает вход, когда пользователь отменен, и он возвращается только после его выбора, вы можете попробовать:
$this->project->users()->sync(array_keys($request->get('contribute'));
Я просто заметил, что у вас есть еще одна ошибка, если вы не обновляете многие проекты одним вызовом, вы должны поместить строку ниже в первую строку своей функции.
$project = $this->project->find($request->project_id);