Я хочу знать, как проверить, является ли возврат 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
Так как поступить в этом случае?






Вы можете использовать конструкцию 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 объектом. так что вы можете избежать гидратации и рассматривать ее как данные одного пользователя.
Меня беспокоит системная логика и шаблоны, в которых вам нужно иметь такого рода условное выражение. Если возможно, я бы порекомендовал провести рефакторинг таким образом, чтобы функция всегда знала, является ли она коллекцией или экземпляром. Вы можете использовать подсказки типов в функциях, чтобы быть более понятными.