2013-09-05 13 views
9

Nie jestem pewien, czy jest to możliwe, ale próbuję uruchomić array_unique na zbiorze elementów, które mam, aby usunąć duplikaty. Chociaż nie mogę tego uruchomić.Array_unique na elitarnej kolekcji laravel

mój sterownik logiczny:

// init models 
    $jobs = Job::search(); 
    $countries = $jobs->get()->map(function($job) { 

     return $job->country; 
    }); 
    $countries = array_unique($countries->toArray()); 

chociaż to dostaje „tablicy do konwersji string” Błąd

+1

Nie jestem pewien, jaka jest zawartość tabeli db, ale czy nie jest łatwiej uzyskać pożądany wynik z zapytania? - i, zechcesz debugować linie kodu, spróbuj wydrukować niektóre dane pomiędzy funkcjami i sprawdź poprawność danych wyjściowych. –

+1

Czy zamiast tego próbowałeś użyć '-> groupby ('country')' lub '-> distinct() -> get (array ('country'))' w zapytaniu? – Jeemusu

Odpowiedz

1

Możesz mieć unikalne wartości w swoich wynikach DB używając distinct or group by w swoim ustawieniu cla posługiwać się. Ale jeśli naprawdę muszą mieć unikalne wartości ponad tablicą obiektu można wykonać następujące czynności:

$uniques = array(); 
foreach ($countries as $c) { 
    $uniques[$c->code] = $c; // Get unique country by code. 
} 

dd($uniques); 
0

Można spróbować metody filtra na zbiorach wymowne, jeśli to jest dokładnie to, co chcesz zrobić

26

można spróbować unikalnej metody klasy kolekcji:

$countries = $countries->unique(); 

Klasa kolekcji ma kilka wspaniałych metod. Możesz przeczytać o tym w Laravel API documentation.

Zgadzam się, że czasami skuteczniej jest "wyszukiwać" w istniejącej kolekcji w pamięci (zamiast wykonywać inne zapytanie w bazie danych przy użyciu klasy Querybuilder), na przykład najpierw trzeba zliczyć, a następnie filtrować. W .NET LINQ można zapytać prawie równie dobrze o IEnumerable (in-memory collection) jak w bazie danych, co bardzo podoba mi się.

2

Miałem podobny problem i chociaż minęło już trochę czasu, ponieważ może być przydatne dla kogoś dzisiaj.

Problem polegał na tym, że gdy zadzwoniłem pod numer unique, metoda zbierania przedmiotów nie zadziałała, prawdopodobnie dlatego pierwsza odpowiedź została przyjęta. Więc jeśli masz model i chcesz usunąć duplikaty oparte na konkretnym obszarze można przekazać parametr do metody unique, w tym przypadku byłoby to:

$countries->unique('code'); 

ten sposób będziesz mieć tylko kraje z unikalnymi kodami . Możesz zauważyć, że pozostaje tylko pierwsza wartość, więc jeśli stworzysz aplikację na zakupy i chcesz z jakiegoś powodu połączyć wózki i chcesz tylko mieć ostatnie przedmioty, możesz po prostu cofnąć kolekcję i zadzwonić pod numer unique i cofnąć ją:

$countries->reverse()->unique('code')->reverse(); // it doesn't really make sense in this example though 

Prawdopodobnie nie jest to najlepsza opcja i lepiej jest wykonać filtrowanie po stronie bazy danych, ale dobrze mieć opcje.