ChatGPT解决这个技术问题 Extra ChatGPT

Laravel Eloquent - 附加与同步

Laravel 4 的 Eloquent ORM 中的 attach()sync() 有什么区别?我试图环顾四周,但找不到任何东西!


J
Jie

附():

处理多对多关系时插入相关模型

不需要数组参数

例子:

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

同步():

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

sync() 接受要放置在数据透视表上的 ID 数组

其次,最重要的是,如果模型不存在于数组中,sync 方法将删除数据透视表中的数据,并且仅将新项目插入到数据透视表中。

例子:

用户角色

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 插入表中。

用户角色表

id  user_id role_id
1    12       1
3    12       2
4    12       3

谢谢!所以理论上,使用 $user()->roles()->detach($oldIDs) 后跟 $user()->roles()->attach($newIDs)$user()->roles()->sync($newIDs) 相同,对吧?
sync() 的第二个参数默认为 true,如果您传递 false,则不匹配的将不会被删除。参考:laravel.com/api/4.2/Illuminate/Database/Eloquent/Relations/…
同步获取最后一个插入ID?
@Deena 实际上数据透视表不需要任何 ID - 所以你不会得到任何 ID :) 但你可以通过重用模型对象变量来获取相关的
当数据透视表不仅有 2 列(user_id,role_id)时怎么样。我想添加 1 列是数据透视表的值,如何将数据添加到该列
A
Andy White

为了使它更简单:

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

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

例子:

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

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

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

如果您使用 sync 函数,帖子的新标签将仅为 [3,4,5]

如果您使用 attach 函数,帖子的新标签将为 [1,2,3,4,5]


我的问题与此类似。我可以用你的答案来解决它谢谢。 stackoverflow.com/a/36573783/308578
m
michal3377

发布的答案没有提到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