Дело в том, что использование sync
переопределит все существующие компоненты, которые уже сохранены, поэтому, если у вас были связанные компоненты с идентификаторами: 1
, 3
и 5
, а затем используйте sync()
для хранения компонентовиз идентификаторов: 2
и 5
, общее количество сохраненных компонентов будет: 2
и 5
.Это связано с тем, что метод sync
отсоединит любое отношение, которое не включено в качестве аргумента.
Из документации :
Синхронизация ассоциаций
Вы также можете использовать метод sync
для построения ассоциаций "многие ко многим".,Метод sync
принимает массив идентификаторов для размещения в промежуточной таблице. Любые идентификаторы, которых нет в данном массиве, будут удалены из промежуточной таблицы .Таким образом, после завершения этой операции в промежуточной таблице будут существовать только идентификаторы в данном массиве:
$user->roles()->sync([1, 2, 3]);
Чтобы избежать этого, попробуйте использовать syncWithoutDetaching()
:
Если вы не хотите отсоединять существующие идентификаторы, вы можете использовать метод syncWithoutDetaching
:
$user->roles()->syncWithoutDetaching([1, 2, 3]);
Не тестируйте его, но это должно быть ожидаемое поведение:
$component = Component::find(1);
$component->contains->pluck('id');
// 1, 3, 5
$component->contains()->syncWithoutDetaching([2, 3, 6]);
$component->contains->pluck('id');
// 1, 2, 3, 3, 6
Вы должны заметить, что эти отношения contains()
соответствуют методу сбора с тем же именем 1045 *, имейте это в виду.