101

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!

0

4 Answers 4

181

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, the sync() method is used to attach related models. However, the main differences are:

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

Example:

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));

The above operation will delete:

id  user_id role_id
2    12       5

And insert role_id 3 to the table.

user_role table

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

Sign up to request clarification or add additional context in comments.

9 Comments

Thank you! So in theory, using $user()->roles()->detach($oldIDs) followed by $user()->roles()->attach($newIDs) is the same as $user()->roles()->sync($newIDs), right?
Also there is one second argument for sync() that is by default true, if you pass false, then the non matching will not be deleted. Refer: laravel.com/api/4.2/Illuminate/Database/Eloquent/Relations/…
get last insert id in sync?
@Deena actually pivot tables don't need any ID - so you don't get any ID back :) but you can get the related ones by reusing the model object variable
Small Note: The attach() method accept arrays of IDs or single value as input. The same goes for the detach() method.
|
65

To make it even simpler:

The attach function only adds 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.

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

1 Comment

my problem is similar to this . i can use your answer to solve it thanks. stackoverflow.com/a/36573783/308578
11

Posted answers don't mention syncWithoutDetaching, so here is my simple take.

If you want to:

  • add the model to the relation, allowing for duplicates, use attach()
  • add the models to the relation, ignoring duplicates, use syncWithoutDetaching()
  • set the relation to the exact models, use sync()

Example:

Calling:

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

echo $user->articles;

Will return articles: 1, 2, 1

Calling:

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

echo $user->articles;

Will return articles: 1, 2

Calling:

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

echo $user->articles;

Will return articles: 3, 4

Comments

2

You also have additional params for sync method:

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

"True" will detach, and false will attach. For example, if you have roles 1,2,3,4 and 5 attached and then you edit and remove 5, sync with "true" will remove 5, while sync with "false" will sync new returned values including 5 already in database.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.