Модель пользователя:
public function positions() { return $this->belongsToMany('App\Position')->withPivot('company_id')->withTimestamps(); }
Позиционная модель:
public function users() { return $this->belongsToMany('App\User')->withPivot('company_id')->withTimestamps(); }
По представлению формы у меня есть два массива:
$allPositionIds array:3 [ 0 => 98 1 => 99 2 => 100 ] $allCompanyIds array:3 [ 0 => 129 1 => 130 2 => 131 ]
С помощью
$user->positions()->sync($allPositionIds);
который синхронизирует таблицу position_user, как и ожидалось, с пользователем и соответствующими идентификаторами позиции.
Однако я не могу понять, как заполнить дополнительное поле («company_id»)
Это то, что я ожидаю от работы:
$user->positions()->sync([$allPositionIds => ['company_id' => $allCompanyIds]], false);
Я прочитал руководство, но я просто не вижу, как обращаться с этими массивами, поскольку примеры из руководства, похоже, относятся к ситуации, когда дополнительное поле, которое нужно заполнить, не является массивом из нескольких элементов:
$user->roles()->sync(array(1 => array('expires' => true)));
Я попытался использовать этот ответ
для объединения двух массивов:
$syncData = array_combine($allPositionIds,$allCompanyIds);
и получить $ syncData из:
array:3 [ 98 => 129 99 => 130 100 => 131 ]
Какая карта соответствует массиву id позиции и массиву идентификаторов компании, но если я попытаюсь
user->positions()->sync($syncData);
Я получаю "SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails" - I believe it is trying to add in the company_id as another position_user.position_id but then it errors out as that doesn't exist in the positions table.
Что бы я ни пытался в данный момент, мое поле company_id
все еще не обновляется / заполняется.
Что я делаю неправильно и как обновить это поле?
Вы на самом деле довольно близки. Требуемый формат:
[ 98 => ['company_id' => 129], 99 => ['company_id' => 130], 100 => ['company_id' => 131] ]
Это должно генерировать правильный массив:
$extra = array_map(function($companyId){ return ['company_id' => $companyId]; }, $allCompanyIds); $data = array_combine($allPositionIds, $extra); $user->positions()->sync($data);