2014-12-01 3 views
30

Offizielle Laravel Dokumentation hat dies auf sync() Funktion:Laravel, sync() - Wie man ein Array synchronisiert und auch zusätzliche Pivot-Felder übergibt?

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

Im letzteren Beispiel nur eine einzige Pivotzeile hinzugefügt wird:

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

Sie auch andere Pivot-Tabellenwerte mit dem angegebenen IDs zugeordnet werden können . Was ich nicht verstehe ist, wie kann ich andere Pivot-Tabellen-Datensätze zuordnen, wenn mehr als eine Zeile synchronisiert werden soll?

Vielen Dank im Voraus.

+0

Die Antwort unten ruhig nicht hat mich durch .. könnten Sie bitte Ihre Lösungen auf diese Stelle? Vielen Dank! – Evis

Antwort

64

Um sync mehrere Modelle zusammen mit den Daten benutzerdefinierte Dreh, müssen Sie diesen:

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

Ie.

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

bearbeiten

Beantwortung der Kommentar:

$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 aber was ist, wenn ich zum Beispiel $ Lautsprecher = \ Input :: get ('Lautsprecher') '(wo $ Lautsprecher wird ein Array), und dann $ Lautsprecher zusammen mit' => Array (' is_speaker '=> wahr) '? –

+1

Nicht was wäre wenn. Sie erstellen ein Sync-Array wie oben gezeigt.Erstellen Sie Ihr Array mit 'ids' als Schlüssel, oder machen Sie es in Ihrem HTML-Formular so. –

+0

Jarek, mein \ Input :: get ('Sprecher') gibt ein Array von IDs zurück. Würde so etwas funktionieren: '$ training-> users() -> sync (array ($ lautsprecher => array ('is_speaker' => true)))' –

4

Dies funktioniert für mich

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

Montage/Demon

Eloquent bietet außerdem einige zusätzliche Hilfsmethoden, um die Arbeit mit verwandten Modellen komfortabler zu gestalten. Stellen wir uns zum Beispiel vor, dass ein Benutzer viele Rollen haben kann und eine Rolle viele Benutzer haben kann. Um eine Rolle an einen Benutzer an, indem einen Datensatz in der Zwischentabelle eingefügt, dass die Modelle verbindet, verwenden, um die Befestigung Methode:

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

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

Wenn eine Beziehung zu einem Modell angebracht wird, man kann auch eine Reihe von zusätzlichen Daten übergeben, um werden in den Zwischen Tabelle eingefügt:

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

Sie können auch Sync verwenden, wenn Sie alte Rollen entfernen möchten, und halten nur die neuen Sie Befestigung jetzt

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

Das Standardverhalten kann geändert werden, indem ein 'false' als zweites Argument übergeben wird. Dies wird die Rollen mit IDs 1,2,3 anhängen, ohne die bestehenden Rollen zu beeinflussen.

In diesem Modus verhält sich sync ähnlich wie attach.

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

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

Verwandte Themen