2015-04-04 11 views
5

Ho due array, $user_roles e $global_roles. Voglio fare un nuovo array, chiamiamolo $available_roles, dove può essere equiparato come gli elementi in $global_roles meno le voci del $user_rolesUnisci due raccolte Eloquent e rimuovi tutti i duplicati.

Ho il seguente codice per farlo ad un allineamento normale. $available_roles = array_unique(array_merge($global_roles, $user_roles), SORT_REGULAR);

Ciò si sta dimostrando problematico a causa del fatto che Laravel non utilizza gli array tradizionali quando si esegue una query, utilizza Raccolte Eloquenti.

Quali altre idee avete ragazzi?

risposta

11

Questo è abbastanza semplice. È possibile utilizzare il metodo merge della collezione:

$available_roles = $global_roles->merge($user_roles); 

Perché merge internamente usa un array associativo (dizionario) che utilizza l'id come chiave, questo dovrebbe rimuovere automaticamente i duplicati.

In ogni modo, però, è possibile rimuovere i duplicati in una raccolta utilizzando unique:

$uniqueCollection = $collection->unique(); 

Ora che è stato per la fusione cosa si sta effettivamente stai cercando è la differenza tra due collezioni . È possibile farlo in due modi:

$available_roles = $user_roles->diff($global_roles); 

o

$available_roles = $global_roles->except($user_roles->modelKeys()); 
+0

capisco come dovrebbe funzionare, ma non sembra funzionare il modo in cui ho inteso a. Ecco un'immagine di come appaiono le Due Raccolte. (http://i.imgur.com/JGIN5en.png) Se il mio ragionamento è corretto, i ruoli disponibili non dovrebbero essere vuoti perché l'Utente ha già i ruoli assegnati a lui. – Rijnhardt

+1

Ah I see. Non stai provando a * unirli * a tutti. Quello che vuoi è la differenza tra i due. Prova '$ available_roles = $ user_roles-> diff ($ global_roles);' o anche '$ available_roles = $ global_roles-> tranne ($ user_roles-> modelKeys());' – lukasgeiter

+0

Grazie, questo era esattamente ciò di cui avevo bisogno! – Rijnhardt