Laravel 5: синхронизация дополнительного поля с помощью pivot

Модель пользователя:

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
]

Который отображается в соответствии с позиционным массивом и идентификатором компании, но если я попытаюсь

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 поле все еще не обновляется / не заполняется.

Что я делаю не так и как мне обновить это поле?

3

Решение

Вы на самом деле довольно близко. Требуемый формат:

[
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);
7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]