Laravel Eloquent - 附加与 SyncWithoutDetaching

Posted

技术标签:

【中文标题】Laravel Eloquent - 附加与 SyncWithoutDetaching【英文标题】:Laravel Eloquent - Attach vs. SyncWithoutDetaching 【发布时间】:2020-09-18 02:22:47 【问题描述】:

Laravel 中的 syncWithoutDetaching 和 attach 有什么区别?

【问题讨论】:

【参考方案1】:

假设您的数据透视表中有自增主键id,您会注意到:

    attach() 会将新记录添加到数据透视表中,并且预先存在的关系将获得新的 id。 sync() 将删除所有存在的关系,并仅在当前请求中提供设置,并使用新的 id。 syncWithoutDetaching() 将删除除当前进程中提供的所有已存在的关系,那么预先存在的行将不会获得新的 id。

【讨论】:

【参考方案2】:

两件事:

    attach() 将始终向数据透视表添加新记录,而 syncWithoutDetaching() 只会在不存在新记录时添加新记录。

假设您有订单和商品。

$order->items()->attach(1);
$order->items()->attach(1);

// $order->items()->count() === 2

$order2->items()->syncWithoutDetaching(1);
$order2->items()->syncWithoutDetaching(1);

// $order2->items()->count() === 1
    attach() 返回 null,而 syncWithoutDetaching() 返回一个数组,显示附加/分离/更新的内容。

【讨论】:

以上是关于Laravel Eloquent - 附加与 SyncWithoutDetaching的主要内容,如果未能解决你的问题,请参考以下文章

将 for 循环的结果附加到 Laravel 中的 eloquent 输出

将 Laravel 集合附加到另一个集合

讨论:Laravel Eloquent vs DB 查询追加

更新附加/分离 Eloquent 关系的时间戳

在 laravel 中定义 eloquent 关系时添加额外的约束

向 eloquent 资源添加过滤器以有条件地附加关系