Laravel, sync () - comment synchroniser un tableau et passer des champs de pivot supplémentaires?

la documentation officielle de Laravel a ceci sur sync() fonction:

$user->roles()->sync( array( 1, 2, 3 ) );

vous pouvez aussi associer d'autres valeurs de table pivot avec les identifiants donnés:

$user->roles()->sync( array( 1 => array( 'expires' => true ) ) );

dans ce dernier exemple, une seule rangée de pivot est ajoutée. Ce que je ne comprends pas c'est comment associer d'autres enregistrements de tables pivotantes s'il y a plus d'une ligne à synchroniser?

Merci d'avance.

35
demandé sur Томица Кораћ 2014-12-01 17:35:45

3 réponses

pour sync plusieurs modèles personnalisés pivot de données, vous avez besoin de ceci:

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

Ie.

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

modifier

Répondre au commentaire:

$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);
79
répondu Jarek Tkaczyk 2014-12-01 15:57:00

Cela fonctionne pour moi

foreach($photos_array as $photo_name){

//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
9
répondu The Dude 2016-06-02 06:00:17

Attacher / Détacher

Éloquent fournit également quelques méthodes d'assistance supplémentaires pour rendre le travail avec des modèles plus pratique. Par exemple, imaginons un utilisateur peut avoir plusieurs rôles et un rôle peut avoir de nombreux utilisateurs. Pour attacher un rôle à un utilisateur en insérant un enregistrement dans la table intermédiaire qui rejoint les modèles, Utilisez la méthode attach:

$user = App\User::find(1);

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

lorsque vous attachez une relation à un modèle, vous pouvez également passer un tableau de données supplémentaires à insérer dans le tableau intermédiaire:

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

vous pouvez également utiliser Sync si vous voulez supprimer les anciens rôles et ne garder les nouveaux vous attachez maintenant

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

le comportement par défaut peut être modifié en passant un 'false' comme seconde argument. Cela permettra d'attribuer les rôles avec l'ids 1,2,3 sans affecter les rôle.

dans ce mode, sync se comporte comme la méthode d'attache.

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

Référence: https://laravel.com/docs/5.4/eloquent-relationships

0
répondu Miguel Trevino 2017-08-24 18:15:00