Этот фрагмент кода должен удалять все старые данные из базы данных и добавлять новые (используя 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);