Метод `syncwithoutdetaching` в Laravel разработан для добавления новых отношений к много-коренной таблице поворота без удаления каких-либо существующих. Относительно того, как он обрабатывает дублирующие идентификаторы, вот подробное объяснение:
- Когда вы называете `syncwithoutdetaching` с массивом идентификаторов, Laravel будет прикреплять только те идентификаторы, которые еще не присутствуют в таблице Pivot для этих отношений. Он не устраняет существующие отношения, в отличие от стандартного метода «синхронизации», который отделяет любые идентификаторы, не входящие в привязый массив [1] [5] [6].
- Однако `syncwithoutdetaching` по своей сути не предотвращает дубликаты, если позволяет им таблица Pivot или ваша логика приложения. Если таблица Pivot не имеет уникального ограничения на комбинацию иностранных ключей, возможно, что дублирующиеся записи должны быть вставлены, если метод называется неправильно или если схема базы данных позволяет [3] [7] [8].
- Чтобы избежать дубликатов, рекомендуется обеспечить соблюдение уникального составного ключа на столбцах таблицы Pivot (например, два столбца иностранных ключей) на уровне базы данных. Это гарантирует, что попытки вставить дублирующие строки не будут провалиться, и вы можете обрабатывать такие исключения в своем приложении [8].
- Внутренне, `syncwithoutdetaching` работает, вызывая метод« синхронизации »со вторым параметром, установленным в` false », что означает« не отсоединяйте ». Это заставляет его добавлять новые записи без удаления существующих. Он проверяет существующие идентификаторы и вводит только те, которые отсутствуют, поэтому обычно он предотвращает добавление дубликатов во время самой операции, если входной массив не содержит дубликатов [1] [6].
- Если дубликаты все еще появляются, это часто связано с любого:
- Входной массив, содержащий дубликаты идентификаторов.
- Отсутствие ограничений на уровне базы данных.
- Используя `adtain ()` вместо `syncwithoutdetaching ()`, поскольку `adtain ()` всегда добавляет новые строки независимо от существующих, потенциально вызывая дубликаты [6] [7].
Таким образом, «SyncWithoutDetaching» позволяет избежать добавления дублирующих отношений во время своей работы, только прикрепляя только идентификаторы, которые еще не связаны, но он полагается на правильные ограничения ввода и базы данных для полного предотвращения дубликатов. Добавление уникального индекса в таблицу Pivot является наилучшей практикой, чтобы гарантировать, что не может существовать дубликаты строк. Если возникают дубликаты, это обычно указывает на отсутствующие ограничения или неправильное использование связанных методов, таких как `adcrent '.
Этот метод особенно полезен, если вы хотите добавить отношения, не влияя на существующие и не рискуя дублирующимися записями, если они правильно используются с правильным дизайном базы данных.
Цитаты:
[1] https://stackoverflow.com/questions/17472128/preventing-laravel-adding-multiple-records-to-a-pivot-table
[2] https://laracasts.com/discuss/channels/laravel/many-to-many-sync-method-creates-duplicates-is-this-really-whay-to-do-it
[3] https://github.com/laravel/framework/issues/21639
[4] https://laracasts.com/discuss/channels/eloquent/belongstomany-and-wanted-duplicates
[5] https://serversideup.net/managing-pivot-data-with-laravel-eloquent/
[6] https://stackoverflow.com/questions/62104188/laravel-eloquent-attach-vs-syncwithoutdetaching
[7] https://www.youtube.com/watch?v=dcrisowswti
[8] https://github.com/laravel/framework/issues/14270