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.
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
@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 . –
Jedną z rzeczy, której ta odpowiedź nie dotyczy jest to, czy działa 'count ($ result)'; dodanie tego szczegółu byłoby usprawnieniem. –