Laravel Eloquent - 附加vs同步

Kou*_*sha 48 php relationship laravel eloquent laravel-4

是什么区别attach(),并sync()在Laravel 4雄辩的ORM?我试着环顾四周但找不到任何东西!

Ana*_*nam 102

连接():

  • 在处理多对多关系时插入相关模型
  • 没有数组参数

例:

$user = User::find(1);

$user->roles()->attach(1);

同步()

与attach()方法类似.sync()也用于附加相关模型.但主要的区别是:

  • Sync方法接受要放置在数据透视表上的ID数组
  • 其次,最重要的是,如果数组中不存在模型并将新项插入数据透视表,则sync方法将从表中删除模型.

例:

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

  • 同时,sync()的第二个参数默认为true,如果传递false,则不会删除非匹配.参考:http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Relations/MorphToMany.html#method_sync (20认同)
  • 谢谢!所以理论上,使用`$ user() - > roles() - > detach($ oldIDs)`后跟`$ user() - > roles() - > attach($ newIDs)`与`$ user相同() - > roles() - > sync($ newIDs)`,对吗? (14认同)
  • 小提示:attach() 方法接受 ID 数组或单个值作为输入。detach() 方法也是如此。 (3认同)

Mah*_*alt 31

为了使它更简单:

该attach函数仅将记录添加到数据透视表.

该sync函数用新记录替换当前记录.这对更新模型非常有用.

例:

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

用户可以更新帖子及其标签.

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

如果您使用该sync功能,帖子的新标签将仅为[3,4,5].

但是如果你使用这个attach功能,帖子的新标签将是[1,2,3,4,5].


mic*_*377 9

发布的答案没有提及syncWithoutDetaching,所以这是我的简单看法。

如果你想:

  • 将模型添加到关系中,允许重复,使用attach()
  • 将模型添加到关系中,忽略重复项,使用syncWithoutDetaching()
  • 设置与确切模型的关系,使用sync()

例子:

呼叫:

$user->articles()->attach(1);
$user->articles()->attach(2);
$user->articles()->attach(1);

echo $user->articles;
Run Code Online (Sandbox Code Playgroud)

将返回文章:1, 2, 1

呼叫:

$user->articles()->syncWithoutDetaching([1]);
$user->articles()->syncWithoutDetaching([2]);
$user->articles()->syncWithoutDetaching([1]);

echo $user->articles;
Run Code Online (Sandbox Code Playgroud)

将返回文章:1, 2

呼叫:

$user->articles()->sync([1]);
$user->articles()->sync([2, 3]);
$user->articles()->sync([3, 4]);

echo $user->articles;
Run Code Online (Sandbox Code Playgroud)

将返回文章:3, 4