2015-01-21 9 views
9

Voglio rimuovere l'utente amministratore dalla mia raccolta. So che è la chiave primaria nella tabella (id) è 1. Ma quando uso forget(1) cancella l'elemento dell'array nella raccolta a partire da 0. Come faccio a rimuovere l'elemento dalla collezione dall'ID?Laravel: come rimuovere l'elemento dalla raccolta da id

+0

vuoi dire, non si desidera eliminare dal database che ? solo dalla collezione $ users? –

+0

sì. non voglio visualizzare l'utente amministratore nell'elenco di utenti sulla mia vista. – Phil

+0

possibile duplicato di [Dimentica non funziona] (http://stackoverflow.com/questions/20735181/forget-doesnt-work) – ceejayoz

risposta

13

Invece di provare a eliminare un elemento dalla raccolta, sarebbe meglio non selezionarlo mai in primo luogo.

Si potrebbe aggiungere un vincolo alla tua richiesta DB in questo modo:

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

(potrebbe essere leggermente diverso a seconda di come i ruoli sono definiti nello schema).

Se si utilizza uno schema più complesso, con un roles tavolo separato e user_role tabella, è possibile interrogare in questo modo:

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

E 'una cattiva idea quella di fare affidamento su l'utente admin essere sempre la prima voce la collezione. Che cosa succede se in seguito si desidera avere più utenti amministratori o per ordinare l'elenco utenti in base alla data di registrazione? Se davvero si vuole rimuovere admin dalla raccolta, Eloquente è dotato di funzionalità di filtraggio:

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

Risposta molto bella. Sto usando Confide/Entrust che corrisponderebbe alla tua seconda soluzione, tranne che usa la colonna 'name' invece di' roles'. La soluzione non seleziona gli utenti che non hanno alcun ruolo assegnato ... Dovrò imporre ruoli di assegnazione a tutti gli utenti che probabilmente dovrei fare comunque ... quindi eccessivo per quello di cui avevo bisogno, ma vabbè. Non mi ci vorrà tanto tempo per sperare. – Phil

+0

Ho incontrato molte difficoltà con Confide/Entrust cercando di salvare la relazione per il ruolo ... per favore vedi [laravel-how-to-query-to-get-all-records-except-where-relation-has-name-column ] http://stackoverflow.com/questions/28095206/laravel-how-to-query-to-get-all-records-except-where-relation-has-name-column se sai come fare il tuo 2 ° query che mi hai mostrato per ottenere gli utenti che non hanno ruoli pure. – Phil

14

Come tale risposta bencohenbaritone s' è il modo migliore per risolvere questo problema, devo aggiungere che laravel Eloquente Collection ha il metodo except(), che può rimuovere oggetti Eloquent dalla raccolta tramite la chiave primaria anziché forget(). Quest'ultimo rimuove per chiave dell'indice di raccolta (come array[i]) e non per chiave primaria.

Così si può scrivere qualcosa di simile (dispiace per il cattivo esempio, il mio caso d'uso è troppo diverso per essere utile per gli altri):

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

Questo mi ha aiutato, perché ho una situazione che non posso fare correttamente con una query solo database e questo era solo il biglietto! – mydoglixu

Problemi correlati