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


272

Це може бути тривіальним питанням, але мені цікаво, чи рекомендує Ларавель певний спосіб перевірити, чи є пустка $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) { ... }що завжди повернеться правдою.

Щоб визначити, чи є якісь результати, ви можете виконати будь-що з наступного:

if ($result->first()) { } 
if (!$result->isEmpty()) { }
if ($result->count()) { }
if (count($result)) { }

Ви також можете використовувати ->first()замість конструктора ->get()запитів, який поверне екземпляр першої знайденої моделі чи nullіншим способом. Це корисно, якщо вам потрібен або очікуєте лише одного результату від бази даних.

$result = Model::where(...)->first();
if ($result) { ... }

Примітки / Посилання

Інформація про бонус

Відмінності колекції та Builder запитів можуть бути дещо заплутаними для новачків Laravel, оскільки імена методів часто однакові між ними. З цієї причини може бути незрозуміло знати, над чим ви працюєте. Побудовник запитів по суті будує запит, поки ви не викличете метод, де він буде виконувати запит і потрапляти в базу даних (наприклад, коли ви викликаєте певні методи, як-от ->all() ->first() ->lists()і інші). Ці методи також існують на Collectionоб'єкті, який може бути повернутий із Builder Query, якщо буде кілька результатів. Якщо ви не впевнені, з яким класом ви працюєте насправді, спробуйте робити var_dump(User::all())і експериментувати, щоб дізнатися, які класи він насправді повертається (за допомогоюget_class(...)). Я настійно рекомендую переглянути вихідний код для класу Collection, це досить просто. Потім перевірте Builder Query і побачите схожість у назвах функцій та дізнайтеся, коли він насправді потрапляє до бази даних.


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

2
@btinn так - якщо ви це зробили тобто Model::first()- це насправді діє за методом "перший" конструктора запитів, а НЕ колекції, тому він вибере перший із бази даних - проте Model::get()поверне примірник Illuminate \ Support \ Колекція, тож якщо ви зробили це, $r = Model::get()то $r->first()він вибере перший предмет із цієї колекції.
Гері Грін

Одне, на що ця відповідь не звертається, чи count($result)працює; додавши, що деталізація буде вдосконаленням.
Марк Амері

Яка різниця між $ result-> count і count ($ result) Чи знову результат $ result-> count потрапляє в базу даних? Якщо ні, то, мабуть, це те саме!
Камі Д

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

70

Я думаю, ти шукаєш:

$result->isEmpty()

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


1
Як щодо того, коли вам потрібно лише перевірити, чи певний стовпець (властивість), як у стовпці $ collection->, порожній / нуль чи ні?
Патрос

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, якщо колекція порожня; інакше помилкове повернення.


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

щоб перевірити чи порожній результат.



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.