2013-12-13 15 views
156

To może być trywialne pytanie, ale zastanawiam się, czy Laravel zaleca pewien sposób sprawdzenia, czy kolekcja Eloquent zwrócona z $result = Model::where(...)->get() jest pusta, a także zliczanie liczby elementów.Wymienna kolekcja: liczenie i wykrywanie pustego

Aktualnie używamy !$result do wykrycia pustego wyniku, czy to wystarczy? Jeśli chodzi o count($result), czy faktycznie obejmuje wszystkie przypadki, w tym pusty wynik?

Odpowiedz

357

Podczas korzystania ->get() nie można po prostu użyć dowolnego z poniższych:

if (empty($result)) { } 
if (!$result) { } 
if ($result) { } 

Bo jeśli dd($result); zauważysz wystąpienie Illuminate\Support\Collection jest zawsze zwrócony, nawet gdy nie nie ma wyników. Zasadniczo to, co sprawdzasz, to $a = new stdClass; if ($a) { ... }, które zawsze zwróci true.

Aby ustalić, czy są jakieś wyniki można wykonać jedną z następujących czynności:

if ($result->first()) { } 
if (!$result->isEmpty()) { } 
if ($result->count()) { } 
if (count($result)) { } 

Można również użyć ->first() zamiast ->get() na konstruktora zapytań, które będą zwracać instancję pierwszego znalezionego modelu, lub null w przeciwnym razie. Jest to przydatne, jeśli potrzebujesz lub oczekujesz tylko jednego wyniku z bazy danych.

$result = Model::where(...)->first(); 
if ($result) { ... } 

Uwagi/Odniesienia

Bonus Information

Kolekcja a różnice Query Builder mogą być nieco mylące dla przybyszów z laravel ponieważ nazwy metod są często takie same między nimi. Z tego powodu może być mylące wiedzieć, nad czym pracujesz. Konstruktor kwerend zasadniczo buduje kwerendę, dopóki nie wywołasz metody, w której wykona zapytanie i trafi do bazy danych (na przykład, gdy wywołasz niektóre metody, takie jak ->all()->first() i inne). Te metody: i istnieją również na obiekcie Collection, które mogą zostać zwrócone z Kreatora zapytań, jeśli istnieje wiele wyników.Jeśli nie masz pewności, z którą klasą pracujesz, spróbuj wykonać var_dump(User::all()) i eksperymentuj, aby zobaczyć, jakie klasy wraca (z pomocą get_class(...)). Gorąco polecam sprawdzenie kodu źródłowego dla klasy Collection, to całkiem proste. Następnie sprawdź narzędzie do tworzenia zapytań i zobacz podobieństwa w nazwach funkcji i dowiedz się, kiedy faktycznie trafi do bazy danych.

+4

thx, aby dodać, że jeśli uruchomisz zapytanie 'first()', wynik różni się od 'get()', który można sprawdzić za pomocą '! $ Result', ponieważ pusty wynik to' null' – bitinn

+2

@btinn yes - - jeśli zrobiłeś to np. 'Model :: first()' - faktycznie działa on na "pierwszej" metodzie konstruktora zapytań, a NIE na kolekcję, dlatego wybierze pierwszą z bazy danych - jednak 'Model :: get() 'zwróci instancję Illuminate \ Support \ Collection, więc jeśli zrobiłeś' $ r = Model :: get() ', a następnie' $ r-> first() ', wybierze pierwszy element z tej kolekcji . –

+0

Jedną z rzeczy, której ta odpowiedź nie dotyczy jest to, czy działa 'count ($ result)'; dodanie tego szczegółu byłoby usprawnieniem. –

43

myślę szukasz:

$result->isEmpty() 

Różni się to od empty($result), który nie będzie prawdą, ponieważ wynik będzie pusty zbiór. Twoja sugestia z count($result) jest również dobrym rozwiązaniem. Nie mogę znaleźć żadnego odniesienia w Dokumentach

+0

Link jest uszkodzony. –

+0

Co powiesz, gdy chcesz tylko sprawdzić, czy określona kolumna (właściwość) w zbiorze $-> kolumna jest pusta/pusta, czy nie? – Pathros

0

tak laravel faktycznie zwraca kolekcję kiedy tylko przy użyciu Model::all(); nie chcesz zbiór chcesz tablicę więc można wpisać ustawienia. (array)Model::all(); następnie można użyć array_filter wrócić wyniki

$models = (array)Model::all() 
$models = array_filter($models); 
if(empty($models)) 
{ 
do something 
} 

będzie to również pozwalają robić takie rzeczy jak count().

+3

utrzymywanie go jako kolekcji jest rzeczywiście wygodne, aby zwrócone przedmioty mogły nadal dziedziczyć wiele przydatnych funkcji w elewacji kolekcji. – Gokigooooks

4

Wyrażam zgodę na powyższą zatwierdzoną odpowiedź. Ale zwykle używam metody $results->isNotEmpty() jak podano poniżej.

if($results->isNotEmpty()) 
{ 
//do something 
} 

To bardziej gadatliwy niż if(!results->isEmpty()) bo czasami zapominamy, aby dodać „!” z przodu, co może skutkować niechcianym błędem.

Należy zauważyć, że ta metoda istnieje od wersji 5.3.

1

Istnieje kilka metod podanych w laravel do sprawdzania wyników liczą/check pusta/nie puste:

$result->isNotEmpty(); // True if result is not empty. 
$result->isEmpty(); // True if result is empty. 
$result->count(); // Return count of records in result. 
0

------ SOLVED ------

w ten sprawa chcesz sprawdzić dwa rodzaje liczyć na dwa Cace

przypadek 1:

ja Wynik f zawierać tylko jeden rekord inne słowo wybrać jeden wiersz z bazy danych za pomocą -> pierwszy()

if(count($result)){ 

     ...record is exist true... 
    } 

Przypadek 2:

jeśli wynik zawierają zestaw do samodzielnego rzędu Innymi słowy za pomocą -> get() lub -> all()

if($result->count()) { 

     ...record is exist true... 
    }