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