Laravel, sync() - how to sync an array and also pass additional pivot fields? Laravel, sync() - how to sync an array and also pass additional pivot fields? laravel laravel

Laravel, sync() - how to sync an array and also pass additional pivot fields?


In order to sync multiple models along with custom pivot data, you need this:

$user->roles()->sync([     1 => ['expires' => true],    2 => ['expires' => false],    ...]);

Ie.

sync([    related_id => ['pivot_field' => value],    ...]);

edit

Answering the comment:

$speakers  = (array) Input::get('speakers'); // related ids$pivotData = array_fill(0, count($speakers), ['is_speaker' => true]);$syncData  = array_combine($speakers, $pivotData);$user->roles()->sync($syncData);


This works for me

foreach ($photos_array as $photo) {    //collect all inserted record IDs    $photo_id_array[$photo->id] = ['type' => 'Offence'];  }//Insert into offence_photo table$offence->photos()->sync($photo_id_array, false);//dont delete old entries = false


Attaching / Detaching

Eloquent also provides a few additional helper methods to make working with related models more convenient. For example, let's imagine a user can have many roles and a role can have many users. To attach a role to a user by inserting a record in the intermediate table that joins the models, use the attach method:

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

When attaching a relationship to a model, you may also pass an array of additional data to be inserted into the intermediate table:

$user->roles()->attach($roleId, ['expires' => $expires]);

You can also use Sync if you want to remove old roles and only keep the new ones you are attaching now

$user->roles()->sync([1 => ['expires' => $expires], 2 => ['expires' => $expires]);

The default behaviour can be changed by passing a 'false' as a second argument.This will attach the roles with ids 1,2,3 without affecting the existing roles.

In this mode sync behaves similar to the attach method.

$user->roles()->sync([1 => ['expires' => $expires], 2 => ['expires' => $expires], false);

Reference: https://laravel.com/docs/5.4/eloquent-relationships