При использовании ->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, посмотрите на сходства в именах функций и выясните, когда он действительно попадает в базу данных.
first()
, результат отличается отget()
, который может быть проверен!$result
как пустой результатnull
Model::first()
он фактически действует по методу 'first` построителя запросов, а не по коллекции, поэтому он выберет первый из базы данных - однакоModel::get()
вернет экземпляр Illuminate \ Support \ Коллекция, так что если вы это сделали,$r = Model::get()
то$r->first()
она выберет первый элемент в этой коллекции.count($result)
работает ли ; добавление этой детали было бы улучшением.foreach
цикл, а затем использовать одну из этих проверок (think:)count($collection->column)
.Я думаю, что вы ищете:
Это отличается от того
empty($result)
, что не будет правдой, потому что результатом будет пустая коллекция. Ваше предложениеcount($result)
также является хорошим решением. Я не могу найти никаких ссылок в документахисточник
Я согласен с утвержденным выше ответом. Но обычно я использую
$results->isNotEmpty()
метод, указанный ниже.Это более многословно, чем
if(!results->isEmpty())
потому, что иногда мы забываем добавить «!» впереди, что может привести к нежелательной ошибке.Обратите внимание, что этот метод существует начиная с версии 5.3 .
источник
В Laravel есть несколько методов для проверки результатов подсчета / проверки пустых / не пустых:
источник
Я думаю, что лучше использовать
источник
Я думаю, что вы пытаетесь что-то вроде
или также использовать
источник
Ты можешь сделать
посчитать результаты.
Вы также можете использовать
проверить, является ли результат пустым.
источник
Согласно документации Laravel, вы можете использовать этот способ:
isEmpty
Метод возвращает ,true
если коллекция пуста; в противном случаеfalse
возвращается.источник
так что Laravel на самом деле возвращает коллекцию, когда просто
Model::all();
вы не хотите, чтобы коллекция требовала массива, чтобы вы могли набрать его.(array)Model::all();
тогда вы можете использовать array_filter для возврата результатовэто также позволит вам делать такие вещи, как
count()
.источник
------ решаемые ------
в этом случае вы хотите проверить два типа счета для двух символов
Случай 1:
если результат содержит только одну запись, другое слово выберите одну строку из базы данных, используя -> first ()
случай 2:
если результат содержит набор из нескольких строк другого слова, используя -> get () или -> all ()
источник
Ты можешь использовать:
$counter = count($datas);
источник