Elokwentna kolekcja: liczenie i wykrywanie pustej

272

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

Obecnie używamy !$resultdo wykrywania pustych wyników, czy to wystarczy? Jeśli chodzi o to count($result), czy faktycznie obejmuje wszystkie przypadki, w tym pusty wynik?

bitinn
źródło

Odpowiedzi:

581

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

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

Ponieważ jeśli dd($result);zauważysz, instancja Illuminate\Support\Collectionjest zawsze zwracana, nawet jeśli nie ma żadnych wyników. Zasadniczo sprawdzasz, $a = new stdClass; if ($a) { ... }co zawsze zwróci prawdę.

Aby ustalić, czy są jakieś wyniki, możesz wykonać dowolną 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 w ->get()kreatorze zapytań, który zwróci instancję pierwszego znalezionego modelu, lub w nullinny sposób. Jest to przydatne, jeśli potrzebujesz lub oczekujesz tylko jednego wyniku z bazy danych.

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

Uwagi / referencje

Informacje o premiach

Różnice między Kolekcją a Konstruktorem kwerend mogą być nieco mylące dla nowicjuszy Laravela, ponieważ nazwy metod między nimi są często takie same. Z tego powodu wiedza, nad którą pracujesz, może być myląca. Konstruktor kwerend zasadniczo buduje kwerendę, dopóki nie wywołasz metody, w której wykona kwerendę i trafi do bazy danych (np. Gdy wywołasz niektóre metody, takie jak ->all() ->first() ->lists()i inne). Te metody istnieją również na Collectionobiekcie, który można zwrócić z Konstruktora zapytań, jeśli istnieje wiele wyników. Jeśli nie masz pewności, z jaką klasą faktycznie pracujesz, spróbuj zrobić var_dump(User::all())i eksperymentować, aby zobaczyć, jakie klasy faktycznie zwraca (z pomocąget_class(...)). Bardzo polecam sprawdzenie kodu źródłowego klasy Collection, jest to dość proste. Następnie sprawdź Konstruktor zapytań, zobacz podobieństwa w nazwach funkcji i dowiedz się, kiedy faktycznie trafi ono do bazy danych.

Gary Green
źródło
4
dzięki, aby dodać, że jeśli uruchomisz zapytanie first(), wynik jest inny niż ten get(), który można sprawdzić za pomocą !$resultpustego wynikunull
bitinn 14.12.2013
2
@btinn tak - jeśli tak, to znaczy Model::first()- działa on zgodnie z metodą „first” konstruktora zapytań, a NIE z kolekcji, dlatego wybierze pierwszą z bazy danych - jednak Model::get()zwróci instancję Illuminate \ Support \ Kolekcja więc jeśli nie $r = Model::get(), a następnie $r->first()będzie ona wyłowić pierwszy element w tej kolekcji.
Gary Green
Jedną z rzeczy, których ta odpowiedź nie dotyczy, jest to, czy count($result)działa; dodanie tego szczegółu byłoby ulepszeniem.
Mark Amery
jaka jest różnica między $ wynik-> liczba a liczba ($ wynik) Czy $ wynik-> liczba ponownie uderza w bazę danych? Jeśli nie, to chyba są takie same!
Kamy D
2
@pathros Nie ma na to prostego sposobu. Będziesz musiał iterować przez każdego członka kolekcji za pomocą foreachpętli, a następnie użyć jednego z tych sprawdzeń (pomyśl:) count($collection->column).
PapaHotelPapa,
70

Myślę, że szukasz:

$result->isEmpty()

Różni się to od empty($result), co nie będzie prawdą, ponieważ wynikiem będzie pusta kolekcja. Twoja sugestia count($result)jest również dobrym rozwiązaniem. Nie mogę znaleźć żadnego odniesienia w dokumentacji

clod986
źródło
1
Co powiesz na to, kiedy chcesz tylko sprawdzić, czy konkretna kolumna (właściwość), taka jak w $ collection-> kolumna jest pusta / pusta, czy nie?
Pathros,
13

Zgadzam się z powyższą zatwierdzoną odpowiedzią. Ale zwykle używam $results->isNotEmpty()metody podanej poniżej.

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

Jest bardziej gadatliwy niż if(!results->isEmpty())dlatego, że czasami zapominamy dodać „!” z przodu, co może spowodować niepożądany błąd.

Zauważ, że ta metoda istnieje od wersji 5.3 .

satish R.
źródło
4

Istnieje kilka metod podanych w Laravel do sprawdzania liczby wyników / sprawdzenia pustych / niepustych:

$result->isNotEmpty(); // True if result is not empty.
$result->isEmpty(); // True if result is empty.
$result->count(); // Return count of records in result.
Lovepreet Singh
źródło
4

Myślę, że lepiej go użyć

$result->isEmpty();

Metoda isEmpty zwraca wartość true, jeśli kolekcja jest pusta; w przeciwnym razie zwracana jest wartość false.

Jignesh Joisar
źródło
3

Myślę, że próbujesz czegoś takiego

  @if(!$result->isEmpty())
         // $result is not empty
    @else
        // $result is empty
    @endif

lub też użyj

if (!$result) { }
if ($result) { } 
przepraszam
źródło
2

Możesz to zrobić

$result = Model::where(...)->count(); 

policzyć wyniki.

Możesz także użyć

if ($result->isEmpty()){}

aby sprawdzić, czy wynik jest pusty.

Patrick Lumenus
źródło
1

Zgodnie z dokumentacją Laravel Documentation możesz użyć tej metody:

$result->isEmpty();

isEmptyMetoda zwraca truejeśli kolekcja jest pusta; w przeciwnym razie falsejest zwracany.

Udhav Sarvaiya
źródło
0

więc Laravel faktycznie zwraca kolekcję, gdy po prostu Model::all(); nie używasz kolekcji, chcesz tablicę, więc możesz wpisać set. (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
}

pozwoli ci to również robić takie rzeczy count().

Benjamin Sweetnam
źródło
3
przechowywanie go jako kolekcji jest w rzeczywistości wygodne, dzięki czemu zwrócone obiekty mogą nadal dziedziczyć wiele przydatnych funkcji na elewacji kolekcji.
Gokigooooks
0

------ROZWIĄZANY------

w takim przypadku chcesz sprawdzić dwa typy liczenia dla dwóch cykli

przypadek 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...
  }

przypadek 2:

jeśli wynik zawiera zestaw wielu wierszy inne słowo za pomocą -> get () lub -> all ()

  if($result->count()) {
    
         ...record is exist true...
  }
Ravindra Bhanderi
źródło
0

Możesz użyć: $counter = count($datas);

nazmulhaqued
źródło