attach()
和sync()
在Laravel 4的Eloquent ORM中有何区别?我尝试寻找答案,但未能找到。
attach()
和sync()
在Laravel 4的Eloquent ORM中有何区别?我尝试寻找答案,但未能找到。
attach():
示例:
$user = User::find(1);
$user->roles()->attach(1);
sync():
sync()
方法与 attach()
方法类似,用于关联模型。然而,其主要区别在于:
sync()
接受一个 ID 数组来放置在中间表上的 ID例如:
user_role
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
。
user_role表
id user_id role_id 1 12 1 3 12 2 4 12 3
更简单的说:
attach
函数只会向Pivot表中添加记录。
sync
函数则用新记录替换当前记录。这非常适合用来更新模型。
例子:
假设你创建了一个帖子(Post),它有多个标签(Tag)与之关联,这些标签的ID是[1,2,3]。
用户可以更新帖子及其标签。
用户将发送新的标签ID [3,4,5] 给你。
如果使用sync
函数,帖子的新标签将仅为[3,4,5]。
如果使用attach
函数,则帖子的新标签将为[1,2,3,4,5]。
已发布的答案没有提到 syncWithoutDetaching
,这里是我的简单解释。
如果你想要:
attach()
syncWithoutDetaching()
sync()
调用:
$user->articles()->attach(1);
$user->articles()->attach(2);
$user->articles()->attach(1);
echo $user->articles;
将返回文章:1,2,1
调用:
$user->articles()->syncWithoutDetaching([1]);
$user->articles()->syncWithoutDetaching([2]);
$user->articles()->syncWithoutDetaching([1]);
echo $user->articles;
将返回文章:1、2
调用:
$user->articles()->sync([1]);
$user->articles()->sync([2, 3]);
$user->articles()->sync([3, 4]);
echo $user->articles;
将返回文章:3、4
$user->roles()->sync([1,2,3], true);
$user()->roles()->detach($oldIDs)
然后跟着使用$user()->roles()->attach($newIDs)
和使用$user()->roles()->sync($newIDs)
是相同的,对吗? - Kousha