Laravel Eloquent - 附加与同步

问题描述 投票:0回答:4

Laravel 4 的 Eloquent ORM 中

attach()
sync()
有什么区别?我试着环顾四周,但什么也没找到!

php laravel laravel-4 eloquent relationship
4个回答
177
投票

附加():

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

示例:

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

同步():

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

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

示例:

用户角色

id 用户_id 角色_id
1 12 1
2 12 5
3 12 2
$user = User::find(12);
$user->roles()->sync(array(1, 2, 3));

以上操作将会删除:

id 用户_id 角色_id
2 12 5

并将

role_id 3
插入表格中。

用户角色表

id 用户_id 角色_id
1 12 1
3 12 2
4 12 3


63
投票

让它变得更简单:

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

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

示例:

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

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

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

如果您使用

sync
功能,帖子的新标签将仅为[3,4,5]

如果您使用

attach
功能,帖子的新标签将为[1,2,3,4,5]


8
投票

发布的答案没有提到

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


0
投票

您还有同步方法的附加参数:

$user->roles()->sync([1,2,3], true); 

“True”将分离,“False”将附着。例如,如果您附加了角色 1,2,3,4 和 5,然后编辑并删除 5,则与“true”同步将删除 5,而与“false”同步将同步新的返回值,包括数据库中已有的 5 .

© www.soinside.com 2019 - 2024. All rights reserved.