Zbiór wymowny: liczenie i wykrywanie pustych
To może trywialne pytanie, ale zastanawiam się, czy Laravel zaleca pewien sposób, aby sprawdzić, czy elokwentny zbiór zwrócony z $result = Model::where(...)->get()
jest pusty, a także policzyć liczbę elementów.
Obecnie używamy !$result
do wykrycia pustego wyniku, czy to wystarczy? Jeśli chodzi o count($result)
, czy faktycznie obejmuje wszystkie przypadki, łącznie z pustym wynikiem?
8 answers
Podczas używania ->get()
nie możesz po prostu użyć żadnego z poniższych:
if (empty($result)) { }
if (!$result) { }
if ($result) { }
Ponieważ jeśli dd($result);
zauważysz, że instancja Illuminate\Support\Collection
jest zawsze zwracana, nawet jeśli nie ma żadnych 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żesz wykonać jedną z następujących czynności:
if ($result->first()) { }
if (!$result->isEmpty()) { }
if ($result->count()) { }
if (count($result)) { }
Możesz również użyć ->first()
zamiast ->get()
w konstruktorze zapytań, który zwróci instancję pierwszego znalezionego modelu, lub null
inaczej. Jest to przydatne, jeśli potrzebujesz lub oczekujesz tylko jednego wyniku z bazy danych.
$result = Model::where(...)->first();
if ($result) { ... }
Uwagi / Referencje
-
->first()
http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_first -
isEmpty()
http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_isEmpty -
->count()
http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_count -
count($result)
działa, ponieważ zbiór implementuje policzalne i wewnętrzną metodęcount()
: http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_count
Informacje Dodatkowe
Różnice w kolekcji i Konstruktorze zapytań mogą być nieco mylące dla nowych użytkowników Laravela, ponieważ nazwy metod są często to samo między nimi. Z tego powodu może być mylące wiedzieć, nad którym pracujesz. Konstruktor zapytań zasadniczo buduje zapytanie, dopóki nie wywołasz metody, w której wykona ono zapytanie i trafi do bazy danych (np. podczas wywoływania pewnych metod, takich jak ->all()
->first()
->lists()
i inni). Te metody również istnieją na obiekcie Collection
, który może zostać zwrócony z konstruktora zapytań, jeśli istnieje wiele wyników. Jeśli nie jesteś pewien, z jaką klasą faktycznie pracujesz, spróbuj zrobić var_dump(User::all())
i poeksperymentować, aby zobaczyć, jakie klasy faktycznie zwracają(z Pomocą get_class(...)
). Gorąco polecam zapoznanie się z kodem źródłowym dla klasy Collection, jest to dość proste. Następnie sprawdź Konstruktor zapytań i zobacz podobieństwa w nazwach funkcji i dowiedz się, kiedy faktycznie trafi do bazy danych.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-02 16:16:20
Myślę, że szukasz:
$result->isEmpty()
Różni się to od empty($result)
, co nie będzie prawdą, ponieważ wynikiem będzie zbiór pusty. Twoja sugestia count($result)
jest również dobrym rozwiązaniem. Nie mogę znaleźć żadnego odniesienia w dokumentach
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-15 00:07:49
Zgadzam się z powyższą zatwierdzoną odpowiedzią. Ale zazwyczaj używam metody $results->isNotEmpty()
, Jak podano poniżej.
if($results->isNotEmpty())
{
//do something
}
Jest bardziej gadatliwy niż if(!results->isEmpty())
ponieważ czasami zapominamy dodać '!"z przodu, co może spowodować niepożądany błąd.
Zauważ, że ta metoda istnieje od wersji 5.3 naprzód.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-27 19:34:03
Istnieje kilka metod podanych w Laravel do sprawdzania liczby wyników / sprawdzania pustych / nie pustych:
$result->isNotEmpty(); // True if result is not empty.
$result->isEmpty(); // True if result is empty.
$result->count(); // Return count of records in result.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-07 15:49:05
Myślę, że próbujesz czegoś takiego
@if(!$result->isEmpty())
// $result is not empty
@else
// $result is empty
@endif
Lub też użyć
if (!$result) { }
if ($result) { }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-30 10:29:38
Tak więc Laravel zwraca kolekcję, gdy tylko użyjesz Model::all();
nie chcesz kolekcji, chcesz tablicę, więc możesz wpisać ustaw ją.
(array)Model::all();
Następnie możesz użyć array_filter, aby zwrócić wyniki
$models = (array)Model::all()
$models = array_filter($models);
if(empty($models))
{
do something
}
To również pozwoli Ci robić rzeczy takie jak count()
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-24 05:06:40
------rozwiązany------
W tym przypadku chcesz sprawdzić dwa rodzaje liczenia dla dwóch cace
Case 1:
Jeśli wynik zawiera tylko jeden rekord inne słowo, wybierz pojedynczy wiersz z bazy danych za pomocą- > first ()
if(count($result)){
...record is exist true...
}
Case 2:
Jeśli wynik zawiera zestaw wielu wierszy innego słowa za pomocą - >get() Lub- > all()
if($result->count()) {
...record is exist true...
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-07 05:45:51
You can do
$result = Model::where(...)->count();
Aby policzyć wyniki.
Możesz również użyć
if ($result->isEmpty()){}
Aby sprawdzić, czy wynik jest pusty.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-01 06:30:53