Laravel Eloquent - Attach vs Sync

8 浏览
0 Comments

Laravel Eloquent - Attach vs Sync

在Laravel 4的Eloquent ORM中,attach()sync()有什么区别?我尝试过查找但没有找到任何信息!

0
0 Comments

Laravel Eloquent - Attach vs Sync

在Laravel中,我们经常会使用Eloquent来处理与数据库的交互。在使用Eloquent的过程中,我们可能会遇到一些问题,比如在更新模型时,如何正确地处理关联关系。在这篇文章中,我们将讨论一个常见的问题:attach和sync方法的区别以及如何选择正确的方法来更新关联关系。

首先,让我们来看一下attach和sync方法的区别。attach方法只会将记录添加到Pivot表中,而不会替换已有的记录。而sync方法则会用新的记录替换掉当前的记录。这对于更新模型非常有用。

举个例子来说明。假设我们有一个已经创建的Post模型,它有很多附加的Tags,它们的ID分别是[1,2,3]。而用户有能力更新Post及其Tags。用户会发送给您新的Tags的ID数组[3,4,5]。如果您使用sync方法,那么Post的新Tags将只包含[3,4,5]。而如果您使用attach方法,Post的新Tags将包含[1,2,3,4,5]。

现在,让我们来看一下为什么会出现这个问题以及解决方法。问题的根源在于我们对于更新关联关系的理解和使用方法。当我们使用attach方法时,我们实际上是在添加新的记录到关联关系中,而不是替换掉已有的记录。这导致了在更新模型时出现了重复的记录。

为了解决这个问题,我们可以使用sync方法来替换掉当前的关联记录。通过使用sync方法,我们可以确保模型的关联关系与用户提供的数据一致,避免了重复记录的问题。当我们需要更新模型的关联关系时,sync方法是一个更好的选择。

总结一下,attach方法和sync方法在更新模型的关联关系时有着不同的行为。attach方法只会添加新的记录,而sync方法会替换掉当前的记录。为了避免出现重复记录的问题,我们应该选择正确的方法来更新模型的关联关系。在大多数情况下,sync方法是更好的选择。

希望本文能够帮助您理解Laravel中attach和sync方法的区别,并且在使用Eloquent处理关联关系时能够更加得心应手。如果您在使用中遇到类似的问题,希望本文能够对您有所帮助。

参考链接:

stackoverflow.com/a/36573783/308578

0
0 Comments

Laravel Eloquent - Attach vs Sync

在Laravel的Eloquent模型中,有两种方法可以用来将关联模型添加到关联关系中,它们分别是attach()和sync()。然而,根据问题的描述,我们可以看出有些情况下这两种方法可能会导致一些问题,因此需要使用其他方法来解决。

问题的原因是,attach()方法会允许重复添加模型到关联关系中,而sync()方法会将关联关系设置为完全匹配给定的模型。因此,在某些情况下,我们需要一种方法既可以添加模型到关联关系中,又可以忽略重复的模型。

解决这个问题的方法是使用syncWithoutDetaching()方法。该方法可以将模型添加到关联关系中,但会忽略重复的模型。

下面是一个示例:

$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

通过使用syncWithoutDetaching()方法,我们可以在不添加重复模型的同时,将模型添加到关联关系中。这样就解决了attach()和sync()方法在某些情况下可能导致的问题。

0
0 Comments

Laravel Eloquent - Attach vs Sync

在使用Laravel框架的Eloquent时,我们经常会遇到attach和sync这两个方法。attach方法用于在多对多关系中插入相关模型,而sync方法也是用于添加相关模型,但两者有一些区别。

attach方法不需要数组作为参数,示例代码如下:

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

sync方法则需要传入一个ID数组作为参数,并且最重要的区别是,如果传入的模型在数组中不存在,sync方法会从关联表中删除该数据,并且只插入新的项目。例如:

$user = User::find(12);
$user->roles()->sync(array(1, 2, 3));

上述操作将会从关联表中删除role_id为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/MorphToMany.html#method_sync](http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Relations/…)

关于获取sync方法的最后插入ID,实际上关联表不需要任何ID,因此无法获取任何ID。但是可以通过重用模型对象变量来获取相关ID。

如果关联表不仅有两列(user_id, role_id),还有其他列,可以如何向该列添加数据呢?

关于这个问题,有一个名为syncWithoutDetaching的方法,唯一的区别是它可以接受一个ID数组作为参数。

attach和detach方法还有一个$touch参数(文档中没有详细说明),可以更新时间戳。sync方法和attach方法都会基于protected $touches = [];来更新时间戳,但是在attach方法中可以手动关闭此功能。对于基本操作来说,二者没有区别。

值得注意的是,attach方法和detach方法都可以接受数组或单个值作为输入。

0