2015-01-21 7 views
9

Ich möchte den Admin-Benutzer aus meiner Sammlung entfernen. Ich weiß, es ist der Primärschlüssel in der Tabelle (ID) ist 1. Aber wenn ich forget(1) verwenden löscht es das Array-Element in der Sammlung beginnend mit 0. Wie entferne ich das Element aus der Sammlung von der ID?Laravel: wie man Artikel aus Sammlung durch ID

// Grab all the users 
    $users = User::all(); //$this->user; use to return array not Laravel Object 
    if($users->find(1)->hasRole('admin')) 
     $users->forget(0); 
+0

Sie meinen, Sie wollen nicht, dass aus der Datenbank löschen ? nur von $ users collection? –

+0

ja. Ich möchte den Admin-Benutzer nicht in der Liste der Benutzer in meiner Ansicht anzeigen. – Phil

+0

möglich duplicate von [Vergiss funktioniert nicht] (http://stackoverflow.com/questions/20735181/forget-doesnt-work) – ceejayoz

Antwort

13

Anstatt zu versuchen, ein Element aus der Sammlung zu löschen, wäre es besser, es nie an erster Stelle auszuwählen.

Sie könnten eine Einschränkung auf Ihre DB Abfrage wie folgt hinzu:

$users = User::where('role', '!=', 'admin')->get(); 

(etwas anders sein könnte, je nachdem wie Rollen in Ihrem Schema definiert sind).

Wenn Sie ein komplexeres Schema mit einem separaten roles Tabelle und user_role Tabelle verwenden, können Sie wie folgt abfragen:

$users = User::whereHas('roles', function($q){ 
    $q->where('role', '!=', 'admin'); 
})->get(); 

Es ist eine schlechte Idee, auf der Benutzer admin verlassen immer das erste Element ist in die Sammlung. Was ist, wenn Sie später mehrere Admin-Benutzer haben oder die Benutzerliste nach dem Registrierungsdatum sortieren möchten? Wenn Sie wirklich Admin aus der Sammlung entfernen möchten, hat Eloquent integrierten Filterfunktionen:

$usersWithoutAdmins = $users->filter(function($user) 
{ 
    return !$user->hasRole('admin'); 
}); 
+1

Sehr nette Antwort. Ich verwende Confide/Entrust, was Ihrer zweiten Lösung entsprechen würde, außer dass es die Spalte 'name' anstelle von' roles' verwendet. Die Lösung wählt keine Benutzer aus, denen keine Rolle zugewiesen wurde ... Ich muss die Zuweisung von Rollen an alle Benutzer erzwingen, was ich wahrscheinlich sowieso tun sollte ... also Overkill für das, was ich brauchte, aber na ja. Ich werde nicht so lange brauchen, bis ich hoffe. – Phil

+0

Ich stieß auf große Schwierigkeiten mit Confide/Entrust, die versuchen, die Relation für die Rolle zu speichern ... siehe [Laravel-How-to-Abfrage-um-alle-Datensätze-außer-wo-Beziehung-hat-Name-Spalte ] http://stackoverflow.com/questions/28095206/laravel-how-to-query-to-get-all-records-except-where-relation-has-name-column wenn Sie wissen, wie Sie Ihre 2. tun Frage, die du mir gezeigt hast, um die Benutzer zu erhalten, die keine Rollen auch haben. – Phil

14

Als solche bencohenbaritone ‚s Antwort ist besser Weg, um dieses Problem zu lösen, muss ich, dass Laravel Eloquent Sammlung hinzufügen hat Methode except(), die beredte Objekte aus der Sammlung von Primärschlüssel statt forget() entfernen kann. Letzteres entfernt den Indexschlüssel (wie array[i]) und nicht den Primärschlüssel.

So können Sie so etwas wie schreiben (sorry über das schlechte Beispiel, ist mein eigener Anwendungsfall zu unterschiedlich für andere nützlich zu sein):

$admin_user_id = 20; 
$users = User::all(); 
$users_without_admin = $users->except($admin_user_id); 
+0

Das hat mir geholfen, weil ich eine Situation habe, die ich mit einer Datenbank-Abfrage nicht richtig machen kann und das war nur das Ticket! – mydoglixu

Verwandte Themen