Laravel проверяет, является ли возврат красноречия одной коллекцией или коллекцией элементов

Я хочу знать, как проверить, является ли возврат Eloquent Query одной строкой из БД или несколькими строками.

Я пробовал $record->count(), но он всегда возвращает значение больше 1 в 2 случаях.

Например:

$record = User::first();
return $record->count(); //it return the count of columns in users table

и если бы я попытался получить всех пользователей;

$record = User::all();
return $record->count(); //it return the count of all rows in users table

Так как поступить в этом случае?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
2 011
4

Ответы 4

Вы можете использовать конструкцию instanceof, чтобы проверить, какие данные представляет ваша переменная.

Для ваших примеров это, вероятно, будет примерно так:

$record = User::first();
$record instanceof \App\User; // returns true
$record instanceof \Illuminate\Database\Eloquent\Collection; // returns false

$record = User::all();
$record instanceof \App\User; // returns false
$record instanceof \Illuminate\Database\Eloquent\Collection; // returns true

Документы: https://secure.php.net/instanceof

User::all() возвращает массив User Таким образом, простой способ — проверить, является ли это массивом.

if (is_array($record)){

}

Вы можете использовать функцию PHP count для этой цели.

$record = User::first();
return count($record);
$record = ......;

if ($record instanceof \Illuminate\Support\Collection){
  // its a collection
}
elseif ($record instanceof \App\User){
  // its a single url instance
}

Однако вышеприведенное нет будет работать напрямую, если вы используете сборщики БД:

$record = DB::table('users')->get();

$record — это массив. Поэтому вам нужно увлажнить его, чтобы вы могли использовать приведенную выше логику:

if (is_array($record){ 
   $record = \App\User::hydrate($record);
}

Теперь вы можете использовать логику if else для $record, поскольку она преобразуется из массива в \Illuminate\Database\Eloquent\Collection, который внутренне расширяется из \Illuminate\Support\Collection

Кроме того, второй случай, если кто-то сделал first() вместо get():

$record = \DB::table('users')->first();

Тогда $record является stdClass объектом. так что вы можете избежать гидратации и рассматривать ее как данные одного пользователя.

Меня беспокоит системная логика и шаблоны, в которых вам нужно иметь такого рода условное выражение. Если возможно, я бы порекомендовал провести рефакторинг таким образом, чтобы функция всегда знала, является ли она коллекцией или экземпляром. Вы можете использовать подсказки типов в функциях, чтобы быть более понятными.

Другие вопросы по теме