Laravel устанавливает один объект по отношению к другому несколько раз - PullRequest
0 голосов
/ 21 марта 2019

Я хочу, чтобы компонент мог содержать один компонент несколько раз. Это отношение многих ко многим.

$component->contains()->sync($components);

Синхронизация предотвращает множественные записи. Другими словами, я хочу, чтобы компонент с идентификатором 1 мог быть связан с компонентом 2 2 раза.

$component->contains

Это должно вернуть компонент 2 2 раза.

Есть ли возможность сделать это?

1 Ответ

0 голосов
/ 21 марта 2019

Дело в том, что использование 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 *, имейте это в виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...