2016-09-04 1 views
2

Hinzufügen weiß, dass ich die Frage Titel ein bisschen trüb ist, aber hier ist, was ich versuche zu tun: Ich habe eine Liste der Gruppeneinen bedingten Wert auf zusätzliche Spalte in Pivot-Tabelle von Array in Laravel

bin abgerufen werden, Ein Benutzer gehört zu einer Drittanbieter-API. In einigen Fällen ist der Benutzer ein "Administrator" für eine Gruppe und manchmal ein "Mitglied". Besonderheiten beiseite, ich rufe eine Methode auf meiner API-Klasse von meinem Controller, die die API trifft, ruft die Gruppen des Benutzers, entscheidet, ob sie ein 'Admin' sind oder nicht und gibt dann ein Array von Arrays mit jeder Gruppe Informationen einschließlich a 'role' Schlüssel, der angibt, ob sie ein 'admin' sind oder nicht. Also meine zurückgegebene Array etwas wie folgt aussieht:

[ 
    0 => [ 
    'unique_id' => 1243657, 
    'name' => 'Group1', 
    'city' => 'Bluesville', 
    'state' => 'IN', 
    'role' => 'admin' 

    ], 

    1 => [ 
    'unique_id' => 4324567, 
    'name' => 'Group2', 
    'city' => 'New Curtsbourough', 
    'state' => 'WI', 
    'role' => 'member' 
    ], 

    2=> [ 
    'unique_id' => 87463652, 
    'name' => 'Group3', 
    'city' => 'Samsonite', 
    'state' => 'MN', 
    'role' => 'member' 
    ] 
] 

Nun, ich brauche diese Gruppen zu nehmen und speichern sie in der Datenbank, die ich durch die Überprüfung zuerst mache, dass die Gruppe nicht in der Datenbank vorhanden ist, dann fügen Sie es bei Bedarf hinzu. Natürlich verlasse ich die Rolle, da sie nur für den aktuellen Benutzer relevant ist.

Als nächstes muss ich den aktuellen Benutzer mit diesen Gruppen, die gerade abgerufen wurden, verbinden. Ich habe eine Pivot-Tabelle eingerichtet, die derzeit die user_id und group_id enthält.

Die Frage ist, wie man damit am besten umgehen kann. Bevor ich entschied, dass ich wissen musste, ob ein Mitglied ein "admin" war oder nicht, ließ ich mir einfach meine "createGroups" -Methode ein Array von Primärschlüsseln zurückgeben und übergab dieses Array an einen Anruf an

$user->groups()->sync($array_of_ids); 

Jedoch, mit der zusätzlichen "Rolle" Informationen, ist es nicht so geschnitten und trocken.

Im Grunde habe ich zu diesem Zeitpunkt im Lebenszyklus Zugriff auf ein Array von Gruppen, das ein Feld "Rolle" enthält. Mein Denken sagt, ein 'Rolle'-Feld zur Pivot-Tabelle hinzuzufügen, die dann' user_id ',' group_id 'und' role 'enthalten würde. Das bedeutet, dass ich nicht nur das Array $ groups mit den abgerufenen Gruppen benötige, sondern auch die IDs dieser Gruppen, die zu meiner Datenbank gehören.

Ich könnte etwas arbeiten, aber ich fürchte, es wäre extrem chaotisch und ineffizient.

Gedanken jemand ??

Antwort

1

Ok, wie es oft auf Stackoverflow passiert, ich bin zu einer Lösung für meine eigene Frage gekommen. Ich schreibe, damit jemand zufällig auf meine Frage stößt, die etwas Ähnliches tun muss, sie können wenigstens sehen, wie eine Person es gehandhabt hat.

Nach der Laravel docs, wenn Sie Beziehungen mit einer zusätzlichen Spalte synchronisieren mögen, müssen Sie die Synchronisierung in der folgenden Art und Weise nennen:

$user->groups()->sync([ 
    1 => ['role' => 'admin'], 
    2 => ['role' => 'member'], 
    3 => ['role' => 'member'] 
]); 

Also, bevor ich synchronisieren konnte ich ein Array benötigt, die ähnelten Das Array, das an 'sync' übergeben wird.

Da ich ein Array von 'Gruppen' hatte, die für jede Gruppe ein Feld namens 'role' enthielten, habe ich eine 'createGroups' Methode erstellt, die im Grunde über das $ groups Array gelaufen ist und die von Laravel angebotene 'insertGetId' Methode aufgerufen hat . Diese Methode behält das Objekt für die Datenbank bei und gibt den Primärschlüssel des erstellten Datensatzes zurück. Für meine ‚Create‘ Methode, habe ich folgendes:

public function createGroups($groups) 
{ 
    $added = array(); 
    foreach($groups as $group){ 
     $id = $this->createGroup($group); 
     $added[$id] = ['role' => $group['role']]; 
    } 

    return $added; 
} 

So wie ich bin ‚Gruppen‘ in die Datenbank einfügen, ich baue das Array auf, die von der ‚sync‘ Methode benötigt wird.Da die 'createGroup' Methode Laravels 'insertGetId' Methode verwendet, gibt sie den Primärschlüssel für diese Gruppe zurück. Dann benutze ich diese ID als Schlüssel für das Array. Nachdem alle Gruppen eingeführt werden, meine ‚hinzugefügt‘ Array, das auf mein Controller zurückgegeben wird, sieht wie folgt aus:

[ 
    1 => ['role' => 'admin'], 
    2 => ['role' => 'member'], 
    3 => ['role' => 'member'] 
] 

das ist genau das, was die ‚sync‘ Methode ist es, was zu tun braucht.

Glückliche Codierung!

Verwandte Themen