Laravel, sync () — как синхронизировать массив, а также передать дополнительные поля сводок?

Официальная документация Laravel имеет это на sync() функция:

$user->roles()->sync( array( 1, 2, 3 ) );

Вы также можете связать другие значения сводной таблицы с данными идентификаторами:

$user->roles()->sync( array( 1 => array( 'expires' => true ) ) );

В последнем примере добавляется только одна строка сводки. Чего я не понимаю, так это как связать другие записи сводной таблицы, если нужно синхронизировать несколько строк?

Заранее спасибо.

40

Решение

Чтобы 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);
90

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

Это работает для меня

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
10

Присоединение / отсоединение

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

Ссылка:
https://laravel.com/docs/5.4/eloquent-relationships

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