2017-02-16 2 views
0

Ich möchte attach() auf einem gefilterten Builder Ergebnis verwenden:Wie benutzt man Laravels attach() für gefilterte Abfrageergebnisse?

$users = User::whereIn('type', array(1, 2))->get(); 

$usersType_1 = $users->filter(function($item) { 
    return $item->type == 1; 
}); 

$usersType_2 = $users->filter(function($item) { 
    return $item->type == 2; 
}); 

$usersType_1->role()->attach(3); 
$usersType_2->role()->attach(4); 

Also, ich brauche die role zu befestigen basierend auf dem Benutzer type. Die role() Methode basiert auf das User Modell angegeben

Der attach() Teil aus dem obigen Code führt den folgenden Fehler: Methode Rolle() nicht existieren - was ich davon ausgehen, geschieht, weil filter() eine Sammlung zurück.

Gibt es eine funktionierende Möglichkeit, Pivot-Einträge an gefilterten Builder-Ergebnissen anzuhängen? Oder muss ich 2 separate Abfragen ausführen und attach() auf ihnen jeweils ausführen?

+0

Rollen() Funktion nicht existiert extrahieren Sie dieses Modell in den Controller – Sona

+0

Alle in einem anderen Modell geschieht. Die Methode 'role()' wird im 'User'-Modell angegeben. – lesssugar

+0

Rollenfunktion gibt es im Benutzermodell. – Sona

Antwort

0

Warum nicht einfach tun:

$usersType_1 = $users->where('type', 1); // or whereType(1) 
$usersType_1->role()->attach(3); 

$usersType_2 = $users->where('type', 2); // or whereType(1) 
$usersType_2->role()->attach(4); 

Ich denke, die „Methode Rolle() existiert nicht“ Ausnahme tritt auf, weil Sie eine Eloquent Sammlung sind Filterung.

EDIT: Ich verstehe, warum das nicht funktioniert. Das liegt daran, dass Sie versuchen, einer Rolle eine gesamte Sammlung zuzuordnen. Es würde funktionieren, wenn Sie find() verwenden und dann eine Rolle anhängen.

So sollten Sie eine Schleife über alle Nutzer mit Typ 1 und befestigen Sie die Rolle

foreach ($usersType_1 as $user) { 
    $user->role()->attach(3); 
} 
+0

Gleicher Fehler, leider. – lesssugar

0

Sie nicht role Methode keine Sammlung statt User Modell nutzen könnten. Versuchen Sie von:

$users = User::whereIn('type', array(1, 2))->get(); 

$usersType_1 = $users->filter(function($item) { 
    if($item->type == 1) { 

     return $item->role()->attach(3); 
    } 
}) 
->all(); 

$usersType_2 = $users->filter(function($item) { 
    if($item->type == 2) { 

     return $item->role()->attach(4); 
    } 
}) 
->all(); 

Alternative:

$users = User::whereIn('type', array(1, 2))->get(); 

$usersType_1 = $users->filter(function($item) { 
    $item->type == 1; 
}) 
->all(); 

$usersType_2 = $users->filter(function($item) { 
    return $item->type == 2; 
}) 
->all(); 

$role1 = Role::find(3); 
$role2 = Role::find(4); 

$role1->users()->attach($usersType_1->puck('id')); 

$role2->users()->attach($usersType_2->puck('id')); 
+0

Funktioniert das nicht grundsätzlich als Schleife, in der 'attach()' 'N'-mal benutzt wird? Wenn ja, wird es nicht sehr effizient sein, vorausgesetzt, ich habe viele Benutzer beider Arten. – lesssugar

+1

Alternativen ist 'Benutzer' zu' Rolle' zuzuordnen. Zuerst finden Sie 'Role' attach' users'. – mrabbani

+0

Das ist eine gute Idee. Vielen Dank! – lesssugar