Красноречивый сбор: подсчет и обнаружение пустых

Это может быть тривиальный вопрос, но мне интересно, рекомендует ли Laravel определенный способ проверить, была ли коллекция Eloquent, возвращенная из $result = Model::where(...)->get() пуста, а также подсчет количества элементов.

В настоящее время мы используем !$result для обнаружения пустого результата, достаточно ли этого? Что касается count($result), действительно ли он охватывает все случаи, включая пустой результат?

Ответ 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) { ... }

Примечания/Ссылки

Информация о бонусах

Различия в Collection и Query Builder могут быть немного запутанными для новичков Laravel, потому что имена методов часто совпадают между ними. По этой причине может быть сложно понять, над чем вы работаете. Query Builder по существу строит запрос до тех пор, пока вы не вызовете метод, в котором он выполнит запрос и попадет в базу данных (например, когда вы вызываете определенные методы, такие как ->all() ->first() ->lists() и другие). Эти методы также существуют в объекте Collection, который может быть возвращен из Query Builder, если имеется несколько результатов. Если вы не знаете, на каком классе вы работаете, попробуйте сделать var_dump(User::all()) и поэкспериментируйте, чтобы узнать, какие классы он фактически возвращает (с помощью get_class(...)). Я настоятельно рекомендую вам проверить исходный код класса Collection, это довольно просто. Затем зайдите в Query Builder и посмотрите на сходства в именах функций и узнайте, когда они фактически попадают в базу данных.

Ответ 2

Я думаю, что вы ищете:

$result->isEmpty()

Это отличается от empty($result), что не будет истинным, потому что результатом будет пустой сбор. Ваше предложение count($result) также является хорошим решением. Я не могу найти ссылку в документах

Ответ 3

Я согласен с вышеприведенным утверждением. Но обычно я использую метод $results->isNotEmpty(), как показано ниже.

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

Это более подробно, чем if(!results->isEmpty()), потому что иногда мы забываем добавить '!' что может привести к нежелательной ошибке.

Обратите внимание, что этот метод существует из версии 5.3 и далее.

Ответ 4

поэтому Laravel фактически возвращает коллекцию, просто используя Model::all(); вам не нужна коллекция, в которой вы хотите получить массив, чтобы вы могли набрать его. (array)Model::all();, то вы можете использовать array_filter для возврата результатов

$models = (array)Model::all()
$models = array_filter($models);
if(empty($models))
{
 do something
}

это также позволит вам делать такие вещи, как count().