Laravel Eloquent - Attach vs Sync

2019-01-10 07:58发布

问题:

What is the difference between attach() and sync() in Laravel 4's Eloquent ORM? I've tried to look around but couldn't find anything!

回答1:

attach():

  • Insert related models when working with many-to-many relations
  • No array parameter is expected

Example:

$user = User::find(1);

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

sync()

Similar to the attach() method. sync() also use to attach related models. However main difference is:

  • Sync method accepts an array of IDs to place on the pivot table
  • Secondly, most important, The sync method will delete the models from table if model does not exist in array and insert new items to the pivot table.

Example:

user_role

id  user_id role_id
1    2       1
2    2       5
3    2       2
$user->roles()->sync(array(1, 2, 3));

The above operation will delete:

id  user_id role_id
2    2       5

And insert role_id 3 to the table.

user_role table

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



回答2:

To make it even simpler:

The attach function only add records to the Pivot table.

The sync function replaces the current records with the new records. This is very useful for updating a model.

Example:

Assuming you have a created Post that has many Tags attached on it where the Tags ID's are [1,2,3].

And the user has the ability to update the Post and its Tags.

The user will send you the new Tags ID's [3,4,5].

If you use the sync function, the new Tags of the Post will be [3,4,5] only.

But if you use the attach function, the new Tags of the Post will be [1,2,3,4,5].