Красноречивая коллекция: подсчет и обнаружение пустых
это может быть тривиальный вопрос, но мне интересно, рекомендует ли Laravel определенный способ проверить, вернулась ли красноречивая коллекция из $result = Model::where(...)->get()
пусто, а также подсчет количества элементов.
В настоящее время мы используем !$result
для того чтобы обнаружить пустой результат, этого достаточно? Что касается count($result)
, это действительно охватывает все случаи, включая пустой результат?
8 ответов:
при использовании
->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_firstisEmpty()
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_countcount($result)
работает, потому что коллекция реализует исчисляемыми внутреннейcount()
способ: http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_countДополнительные Сведения
различия в коллекции и Построителе запросов могут быть немного запутанными для новичков Laravel, потому что имена методов часто совпадают между ними. По этой причине может быть непонятно, над чем вы работаете. Построитель запросов по существу строит запрос до тех пор, пока вы не вызовете метод, в котором он будет выполнять запрос и нажмите на базу данных (например, когда вы вызываете определенные методы, такие как
->all()
->first()
->lists()
и другие). Эти методы и наCollection
объект, который может быть возвращен из построителя запросов при наличии нескольких результатов. Если вы не уверены, с каким классом вы на самом деле работаете, попробуйте сделатьvar_dump(User::all())
и экспериментировал, чтобы увидеть, какие классы он на самом деле возвращается (с помощьюget_class(...)
). Я настоятельно рекомендую вам проверить исходный код для класса коллекции, это довольно просто. Затем проверьте построитель запросов и посмотрите сходство в именах функций и узнайте, когда он действительно попадает в базу данных.
Я думаю, что вы ищете:
$result->isEmpty()
отличается от
empty($result)
, что не будет истинно, потому что результатом будет пустая коллекция. Ваше предложениеcount($result)
также является хорошим решением. Я не могу найти ссылку в документах
Я согласен с выше утвержденных ответа. Но обычно я использую
$results->isNotEmpty()
метод, как показано ниже.if($results->isNotEmpty()) { //do something }
это более многословно, чем
if(!results->isEmpty())
потому что иногда мы забываем добавить '!'впереди, что может привести к нежелательной ошибке.обратите внимание, что этот метод существует с версии 5.3 далее.
в Laravel есть несколько методов для проверки количества результатов / проверки пустого / не пустого:
$result->isNotEmpty(); // True if result is not empty. $result->isEmpty(); // True if result is empty. $result->count(); // Return count of records in result.
Я думаю, вы попробуете что-то вроде
@if(!$result->isEmpty()) // $result is not empty @else // $result is empty @endif
или же использовать
if (!$result) { } if ($result) { }
таким образом, Laravel фактически возвращает коллекцию, когда просто использует
Model::all();
вы не хотите коллекцию вы хотите массив, так что вы можете ввести установить его.(array)Model::all();
затем вы можете использовать array_filter для возврата результатов$models = (array)Model::all() $models = array_filter($models); if(empty($models)) { do something }
это также позволит вам делать такие вещи, как
count()
.
------решена------
в этом случае вы хотите проверить два типа подсчета для двух cace
Пример 1:
если результат содержит только одну запись другое слово выберите одну строку из базы данных с помощью ->first ()
if(count($result)){ ...record is exist true... }
Пример 2:
если результат содержит набор из нескольких строк другого слова с помощью - > get() или - >all ()
if($result->count()) { ...record is exist true... }