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?

Author: bitinn, 2013-12-13

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

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.

 415
Author: Gary Green,
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

 50
Author: clod986,
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.

 6
Author: sathish R,
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.
 2
Author: Lovepreet Singh,
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) { } 
 1
Author: pardeep,
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().

 0
Author: Benjamin Sweetnam,
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...
  }
 0
Author: Ravindra Bhanderi,
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.

 0
Author: PatrickL,
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