2015-04-04 18 views
5

Mam dwie tablice, $user_roles i $global_roles. Chcę zrobić nową tablicę, nazwijmy to $available_roles, gdzie może być utożsamiane jako elementów w $global_roles mniej elementów w $user_rolesPołącz dwie elokwentne kolekcje i usuń wszystkie duplikaty.

Mam następujący kod, aby to zrobić na normalnej tablicy. $available_roles = array_unique(array_merge($global_roles, $user_roles), SORT_REGULAR);

Jest to problematyczne ze względu na fakt, że Laravel nie używa tradycyjnych tablic, gdy wykonuje kwerendę, używa Eumquent Collections.

Jakie masz inne pomysły?

Odpowiedz

11

Jest to dość proste. Można użyć kolekcji za merge metody:

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

Ponieważ merge wewnętrznie wykorzystuje tablicę asocjacyjną (słownik), który korzysta z id jako klucz, to powinien automatycznie usunąć duplikaty.

Anyways chociaż można usunąć duplikaty w kolekcji przy użyciu unique:

$uniqueCollection = $collection->unique(); 

Teraz to było dla łączących czego właściwie szukasz jest różnica między dwoma zbiorami . Można to zrobić na dwa sposoby:

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

lub

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

rozumiem jak to ma działać, ale nie wydaje się działać tak, że zamierzam go. Oto zdjęcie tego, jak wyglądają dwie Kolekcje. (http://i.imgur.com/JGIN5en.png) Jeśli moje rozumowanie jest poprawne, czy dostępne role nie powinny być puste, ponieważ Użytkownik ma już przypisane mu role – Rijnhardt

+1

Ah Widzę. Nie próbujesz * scalić * ich w ogóle. To, czego chcesz, to różnica między nimi. Wypróbuj '$ available_roles = $ user_roles-> diff ($ global_roles);' lub także '$ available_roles = $ global_roles-> except ($ user_roles-> modelKeys());' – lukasgeiter

+0

Dziękuję, to było dokładnie to, czego potrzebowałem! – Rijnhardt