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


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

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

8 191

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) { ... }

Заметки / Ссылки

Дополнительные Сведения

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

можно сделать

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

для подсчета результатов.

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

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

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