Laravel проверяет, является ли возврат eloquent одной коллекцией или набором элементов - PullRequest
0 голосов
/ 16 февраля 2019

Я хочу знать, как проверить, возвращен ли 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

Так как же справиться с этим делом?

Ответы [ 4 ]

0 голосов
/ 16 февраля 2019
$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 объектом.так что вы можете избежать гидратации и рассматривать его как однопользовательские данные.

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

0 голосов
/ 16 февраля 2019

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

if (is_array($record)){

}
0 голосов
/ 16 февраля 2019

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

$record = User::first();
return count($record);
0 голосов
/ 16 февраля 2019

Вы можете использовать конструкцию 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...