Красноречивая коллекция: подсчет и обнаружение пустых

136

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

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

Теги:
eloquent
laravel-4

4 ответа

320
Лучший ответ

При использовании ->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 и посмотрите на сходства в именах функций и узнайте, когда они фактически попадают в базу данных.

  • 4
    THX, просто чтобы добавить, что если вы запустите query first() , результат будет отличаться от get() , который можно проверить с помощью !$result как пустой результат равен null
  • 2
    @btinn да - если вы это сделали, т.е. Model::first() - он фактически действует по методу 'first` построителя запросов, а НЕ по коллекции, поэтому он выберет первый из базы данных - однако Model::get() вернет экземпляр Illuminate \ Support \ Collection, поэтому, если вы сделали $r = Model::get() а затем $r->first() он выберет первый элемент в этой коллекции.
Показать ещё 9 комментариев
39

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

$result->isEmpty()

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

  • 0
    Ссылка не работает.
  • 1
    Как насчет того, когда вы только один хотите проверить, является ли определенный столбец (свойство), как в $ collection-> column, пустым / пустым или нет?
2

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

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

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

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

0

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

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

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

  • 3
    хранить его как коллекцию на самом деле удобно, так что возвращаемые объекты могут все еще наследовать множество полезных функций на фасаде коллекции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню