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


272

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

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

Ответы:


581

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


4
THX, просто чтобы добавить, что если вы запустите запрос first(), результат отличается от get(), который может быть проверен !$resultкак пустой результатnull
bitinn

2
@btinn да - если вы это сделали, т.е. Model::first()он фактически действует по методу 'first` построителя запросов, а не по коллекции, поэтому он выберет первый из базы данных - однако Model::get()вернет экземпляр Illuminate \ Support \ Коллекция, так что если вы это сделали, $r = Model::get()то $r->first()она выберет первый элемент в этой коллекции.
Гэри Грин

Одна вещь, на которую этот ответ не обращается, - count($result)работает ли ; добавление этой детали было бы улучшением.
Марк Амери

В чем разница между $ result-> count и count ($ result) Снова попадает ли $ result-> count в базу данных? Если нет, то я думаю, что это то же самое!
Камы Д

2
@pathros Нет простого способа сделать это. Вам нужно будет перебрать каждый элемент коллекции, используя foreachцикл, а затем использовать одну из этих проверок (think:) count($collection->column).
PapaHotelPapa

71

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

$result->isEmpty()

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


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

13

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

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

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

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


4

В Laravel есть несколько методов для проверки результатов подсчета / проверки пустых / не пустых:

$result->isNotEmpty(); // True if result is not empty.
$result->isEmpty(); // True if result is empty.
$result->count(); // Return count of records in result.

4

Я думаю, что лучше использовать

$result->isEmpty();

Метод isEmpty возвращает true, если коллекция пуста; в противном случае возвращается false.


3

Я думаю, что вы пытаетесь что-то вроде

  @if(!$result->isEmpty())
         // $result is not empty
    @else
        // $result is empty
    @endif

или также использовать

if (!$result) { }
if ($result) { } 

2

Ты можешь сделать

$result = Model::where(...)->count(); 

посчитать результаты.

Вы также можете использовать

if ($result->isEmpty()){}

проверить, является ли результат пустым.


1

Согласно документации Laravel, вы можете использовать этот способ:

$result->isEmpty();

isEmptyМетод возвращает , trueесли коллекция пуста; в противном случае falseвозвращается.


0

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

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

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


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

0

------ решаемые ------

в этом случае вы хотите проверить два типа счета для двух символов

Случай 1:

если результат содержит только одну запись, другое слово выберите одну строку из базы данных, используя -> first ()

 if(count($result)){
     
       ...record is exist true...
  }

случай 2:

если результат содержит набор из нескольких строк другого слова, используя -> get () или -> all ()

  if($result->count()) {
    
         ...record is exist true...
  }

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.