Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon SyncWithOutDetaching如何处理重复ID


SyncWithOutDetaching如何处理重复ID


Laravel中的“ SyncWithOutDetaching”方法旨在在不删除任何现有的枢轴表中添加新的关系。关于如何处理重复ID,这是一个详细的解释:

- 当您使用一系列ID调用`syncWithOutDetaching`时,Laravel将仅附上有关该关系的枢轴表中尚未存在的那些ID。与标准“同步方法”不同,它不会删除现有关系,该方法将未在提供的数组中没有ID [1] [5] [6]中分离出来。

- 但是,`如果枢轴表或您的应用程序逻辑允许它们,`syncWithOutDetaching`本身并不能固有地阻止重复。如果枢轴表对外键的组合没有唯一的约束,则如果该方法被错误地调用,或者数据库架构允许它允许[3] [7] [8],则可以插入重复条目。

- 为避免重复,建议在数据库级别上强制枢轴表列(例如,两个外键列)上的唯一复合键。这样可以确保尝试插入重复行的尝试将失败,并且您可以在应用程序中处理此类例外[8]。

- 在内部,`syncwithoutdetaching`通过调用第二个参数设置为`false'的`sync'方法来工作,这意味着“不要脱离”。这导致它添加新​​条目而不删除现有条目。它检查现有的ID并仅插入丢失的ID,因此,如果输入阵列不包含重复项[1] [6],则通常会在操作本身中添加重复项。

- 如果仍然出现重复项,则通常是由于:
- 包含重复ID的输入阵列。
- 缺乏数据库级约束。
- 使用`facter()`而不是`syncWithOutDetaching()`,因为`eather()总是添加新行不到现有的行,可能会导致重复[6] [7]。

总而言之,`syncwithoutdetaching`避免在操作过程中添加重复关系,而仅附加尚未相关的ID,但它依赖于适当的输入和数据库约束来完全防止重复。在枢轴表上添加唯一的索引是确保不存在重复行的最佳实践。如果发生重复,通常表示缺少限制或不正确的相关方法的用法。

当您想添加关系而不影响现有的关系而不冒险使用适当的数据库设计时,此方法特别有用。

引用:
[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-is-is-this-this-this-the-the-the-the-the-right-the-right-way-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-athach-vs-syncwithoutdetaching
[7] https://www.youtube.com/watch?v=dcrisowswti
[8] https://github.com/laravel/framework/issues/14270