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

это может быть тривиальный вопрос, но мне интересно, рекомендует ли 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) { ... }

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

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

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


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

$result->isEmpty()

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


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

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

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

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


в Laravel есть несколько методов для проверки результатов count / check empty/not empty:

$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(); вам не нужна коллекция, вам нужен массив, поэтому вы можете ввести set it. (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()){}

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