При использовании ->get()
вы не можете просто использовать любой из следующих:
if (empty($result)) { }
if (!$result) { }
if ($result) { }
Потому что, если вы dd($result);
заметите, экземпляр Illuminate\Support\Collection
всегда возвращается, даже если нет результатов. По сути, вы проверяете, $a = new stdClass; if ($a) { ... }
что всегда возвращает true.
Чтобы определить, есть ли какие-либо результаты, вы можете выполнить одно из следующих действий:
if ($result->first()) { }
if (!$result->isEmpty()) { }
if ($result->count()) { }
if (count($result)) { }
Вы также можете использовать ->first()
вместо ->get()
построителя запросов, который будет возвращать экземпляр первой найденной модели, или null
иным образом. Это полезно, если вам нужен или ожидается только один результат из базы данных.
$result = Model::where(...)->first();
if ($result) { ... }
Примечания / Ссылки
Бонусная информация
Различия в Collection и Query Builder могут немного сбивать с толку новичков в Laravel, поскольку имена методов часто совпадают между ними. По этой причине может быть сложно узнать, над кем вы работаете. По сути, Query Builder строит запрос до тех пор, пока вы не вызовете метод, где он выполнит запрос и попадет в базу данных (например, когда вы вызываете определенные методы, такие как ->all()
->first()
->lists()
и другие). Эти методы также существуют в Collection
объекте, который можно получить из построителя запросов, если имеется несколько результатов. Если вы не уверены, с каким классом вы на самом деле работаете, попробуйте сделать var_dump(User::all())
и экспериментировать, чтобы увидеть, какие классы он на самом деле возвращает (с помощьюget_class(...)
). Я настоятельно рекомендую вам проверить исходный код класса Collection, он довольно прост. Затем проверьте Query Builder, посмотрите на сходства в именах функций и выясните, когда он действительно попадает в базу данных.
first()
, результат отличается отget()
, который может быть проверен!$result
как пустой результатnull