Официальная документация Laravel имеет это на sync()
функция:
$user->roles()->sync( array( 1, 2, 3 ) );
Вы также можете связать другие значения сводной таблицы с данными идентификаторами:
$user->roles()->sync( array( 1 => array( 'expires' => true ) ) );
В последнем примере добавляется только одна строка сводки. Чего я не понимаю, так это как связать другие записи сводной таблицы, если нужно синхронизировать несколько строк?
Заранее спасибо.
Чтобы sync
несколько моделей вместе с пользовательскими сводными данными, вам нужно это:
$user->roles()->sync( array(
1 => array( 'expires' => true ),
2 => array( 'expires' => false ),
...
));
То есть.
sync( array(
related_id => array( 'pivot_field' => value ),
...
));
редактировать
Отвечая на комментарий:
$speakers = (array) Input::get('speakers'); // related ids
$pivotData = array_fill(0, count($speakers), ['is_speaker' => true]);
$syncData = array_combine($speakers, $pivotData);
$user->roles()->sync($syncData);
Это работает для меня
foreach($photos_array as $photo_name){
//collect all inserted record IDs
$photo_id_array[$photo->id] = ['type' => 'Offence'];
}
//Insert into offence_photo table
$offence->photos()->sync($photo_id_array, false);//dont delete old entries = false
Присоединение / отсоединение
Eloquent также предоставляет несколько дополнительных вспомогательных методов, чтобы сделать работу со связанными моделями более удобной. Например, давайте представим, что у пользователя может быть много ролей, а у роли может быть много пользователей. Чтобы присоединить роль к пользователю, вставив запись в промежуточную таблицу, которая объединяет модели, используйте метод присоединения:
$user = App\User::find(1);
$user->roles()->attach($roleId);
Прикрепляя отношение к модели, вы также можете передать массив дополнительных данных для вставки в промежуточную таблицу:
$user->roles()->attach($roleId, ['expires' => $expires]);
Вы также можете использовать Синхронизацию, если хотите удалить старые роли и сохранить только
новые, которые вы прикрепляете сейчас
$user->roles()->sync([1 => ['expires' => $expires], 2 => ['expires' => $expires]);
Поведение по умолчанию можно изменить, передав «false» как секунду
аргумент.
Это прикрепит роли с идентификаторами 1,2,3, не влияя на существующие
роли.
В этом режиме синхронизация ведет себя подобно методу присоединения.
$user->roles()->sync([1 => ['expires' => $expires], 2 => ['expires' => $expires], false);