【发布时间】:2014-08-04 04:13:00
【问题描述】:
在更新模型并同步关系时,如果我没有传入所有已经存在的 id,是否会删除该关系?
【问题讨论】:
标签: laravel-4 relational-database eloquent
在更新模型并同步关系时,如果我没有传入所有已经存在的 id,是否会删除该关系?
【问题讨论】:
标签: laravel-4 relational-database eloquent
答案是肯定的。我找不到任何实际上说明了这一点的文档。
假设您有 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() 方法应该删除不再存在的关系并保留仍然相关的关系。
$author->books->delete();
您决定: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 中删除了所有标签。那么如何删除所有标签呢?