2014-12-01 7 views
30
documentazione

Gazzetta laravel ha questo su sync() funzione:Laravel, sync() - come sincronizzare un array e anche passare altri campi di pivot?

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

Si possono anche associare altri valori della tabella di perno con gli ID indicati:

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

In quest'ultimo esempio solo l'aggiunta di una singola riga perno . Quello che non capisco è come posso associare altri record della tabella pivot se ci sono più di una riga da sincronizzare?

Grazie in anticipo.

+0

La risposta qui sotto non ha tranquilla mi ha fatto attraverso .. per favore potete inviare le vostre soluzioni a questo? Grazie! – Evis

risposta

64

Per sync più modelli insieme ai dati di articolazione personalizzati, avete bisogno di questo:

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

Ie.

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

modificare

Rispondere al commento:

$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); 
+1

Jarek ma cosa succede se ho per esempio '$ speakers = \ Input :: get ('speakers')' (dove $ speakers diventa un array), e poi voglio passare '$ speakers' insieme a' => array (' is_speaker '=> true) '? –

+1

Non che se. Crei array di sincronizzazione come mostrato sopra.Costruisci il tuo array con 'ids' come chiavi, o fallo in questo modo nel tuo modulo HTML. –

+0

Jarek, my \ Input :: get ('speakers') restituisce una matrice di ID. Sarebbe qualcosa di simile a questo: '$ training-> users() -> sync (array ($ speakers => array ('is_speaker' => true)))' –

4

Questo funziona per me

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 
0

Montaggio/Smontaggio

Eloquent fornisce anche alcuni metodi di supporto aggiuntivi per rendere più conveniente il lavoro con i modelli correlati. Ad esempio, immaginiamo che un utente possa avere molti ruoli e che un ruolo possa avere molti utenti. Per collegare un ruolo a un utente inserendo un record della tabella intermedia che unisce i modelli, utilizzare il metodo attach:

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

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

Quando si attacca una relazione a un modello, si può anche passare una matrice di dati aggiuntivi essere inserita nella tabella intermedia:

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

È inoltre possibile utilizzare la sincronizzazione se si desidera rimuovere i ruoli vecchi e mantenere solo quelli nuovi si collega ora

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

Il comportamento predefinito può essere modificato passando un "falso" come secondo argomento . Collegherà i ruoli con ID 1,2,3 senza influire sui ruoli esistenti .

In questa modalità, la sincronizzazione si comporta in modo simile al metodo di collegamento.

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

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

Problemi correlati