【问题标题】:Laravel Eloquent - Attach vs SyncLaravel Eloquent - 附加与同步
【发布时间】:2014-07-21 00:42:04
【问题描述】:

Laravel 4 的 Eloquent ORM 中 attach()sync() 有什么区别?我试图环顾四周,但找不到任何东西!

【问题讨论】:

    标签: php laravel laravel-4 eloquent relationship


    【解决方案1】:

    attach():

    • 在处理多对多关系时插入相关模型
    • 不需要数组参数

    例子:

    $user = User::find(1);
    $user->roles()->attach(1);
    

    sync():

    attach()方法类似,sync()方法用于附加相关模型。但是,主要区别在于:

    • sync() 接受要放置在数据透视表上的 ID 数组
    • 其次,最重要的,如果数组中不存在模型,sync 方法将删除数据透视表中的数据,并且仅将新项目插入到数据透视表中。

    例子:

    用户角色

    id user_id role_id 1 12 1 2 12 5 3 12 2
    $user = User::find(12);
    $user->roles()->sync(array(1, 2, 3));
    

    以上操作将删除:

    id user_id role_id 2 12 5

    并在表格中插入role_id 3

    用户角色表

    id user_id role_id 1 12 1 3 12 2 4 12 3

    【讨论】:

    • 谢谢!所以理论上,使用$user()->roles()->detach($oldIDs) 后跟$user()->roles()->attach($newIDs)$user()->roles()->sync($newIDs) 是一样的,对吧?
    • 还有一个sync()的第二个参数,默认为true,如果你传递false,那么不匹配的就不会被删除。参考:laravel.com/api/4.2/Illuminate/Database/Eloquent/Relations/…
    • 同步获取最后一个插入 ID?
    • @Deena 实际上数据透视表不需要任何 ID - 所以你不会得到任何 ID :) 但你可以通过重用模型对象变量来获得相关的
    • 当数据透视表不仅有 2 列(user_id,role_id)时怎么样。我想添加 1 列是数据透视表的值,如何向该列添加数据
    【解决方案2】:

    为了更简单:

    attach 函数仅将记录添加到数据透视表中。

    sync 函数将当前记录替换为新记录。这对于更新模型非常有用。

    示例:

    假设您创建了一个贴有许多标签的帖子,其中标签 ID 为 [1,2,3]

    并且用户可以更新帖子及其标签。

    用户将向您发送新标签 ID 的 [3,4,5]。

    如果您使用sync 函数,帖子的新标签将仅为[3,4,5]

    如果您使用attach 函数,帖子的新标签将为[1,2,3,4,5]

    【讨论】:

    猜你喜欢
    • 2020-09-18
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多