【问题标题】:Does Eloquent relation sync also remove?Eloquent 关系同步是否也会删除?
【发布时间】:2014-08-04 04:13:00
【问题描述】:

在更新模型并同步关系时,如果我没有传入所有已经存在的 id,是否会删除该关系?

【问题讨论】:

    标签: laravel-4 relational-database eloquent


    【解决方案1】:

    答案是肯定的。我找不到任何实际上说明了这一点的文档。

    假设您有 2 个表:“authors”和“books”,还有一个数据透视表“book_authors”。

    创建新作者时:

    $author_id =2;
    $author->books()->sync(array(1,4,5,15));
    

    现在您在该数据透视表“book_authors”中有 4 个条目:

    author_id  book_id
    2          1
    2          4
    2          5
    2          15
    

    现在更新:

    $author_id =2;
    $author->books()->sync(array(1,15));
    

    现在“book_authors”是:

    author_id  book_id
        2          1
        2          15
    

    【讨论】:

    • 我可以确认。 sync() 方法应该删除不再存在的关系并保留仍然相关的关系。
    • 但是如果我删除所有标签,sync() 根本不会做任何事情。在这种情况下,您如何使其工作?例如,如果之前您在关系表中有 [1,4,5,15] 并且想要进行同步([]),因为您已经从 Select2 中删除了所有标签。那么如何删除所有标签呢?
    • 您可以使用关系删除它。 $author->books->delete();
    【解决方案2】:

    您决定:sync 有第二个参数,默认为 true 并负责分离:

    $model->relationship()->sync([1,2,3]);
    
    $model->relationship()->sync([4,5,6]); // attached [4,5,6], detached [1,2,3]
    $model->relationship()->getRelatedIds(); // [4,5,6]
    
    // but:
    $model->relationship()->sync([4,5,6], false); // attached [4,5,6], detached []
    $model->relationship()->getRelatedIds(); // [1,2,3,4,5,6]
    

    【讨论】:

    • 但是如果我删除所有标签,sync() 根本不会做任何事情。在这种情况下,您如何使其工作?例如,如果之前您在关系表中有[1,2,3],并且想要创建一个sync([]),因为您已经从 Select2 中删除了所有标签。那么如何删除所有标签呢?
    猜你喜欢
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    相关资源
    最近更新 更多