Ответ 1
При использовании ->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) { ... }
Примечания/Ссылки
-
->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)
работает, потому что Collection реализует Countable и внутренний методcount()
: http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_count
Информация о бонусах
Различия в Collection и Query Builder могут быть немного запутанными для новичков Laravel, потому что имена методов часто совпадают между ними. По этой причине может быть сложно понять, над чем вы работаете. Query Builder по существу строит запрос до тех пор, пока вы не вызовете метод, в котором он выполнит запрос и попадет в базу данных (например, когда вы вызываете определенные методы, такие как ->all()
->first()
->lists()
и другие). Эти методы также существуют в объекте Collection
, который может быть возвращен из Query Builder, если имеется несколько результатов. Если вы не знаете, на каком классе вы работаете, попробуйте сделать var_dump(User::all())
и поэкспериментируйте, чтобы узнать, какие классы он фактически возвращает (с помощью get_class(...)
). Я настоятельно рекомендую вам проверить исходный код класса Collection, это довольно просто. Затем зайдите в Query Builder и посмотрите на сходства в именах функций и узнайте, когда они фактически попадают в базу данных.