Colección eloquent: contar y detectar vacío

Esta es quizás una pregunta trivial, pero me pregunto si Laravel recomienda una forma determinada de verificar si una colección Eloquent regresó de $result = Model::where(...)->get() está vacía, así como contar el número de elementos.

Actualmente estamos usando !$result para detectar el resultado vacío, ¿es suficiente? En cuanto a la count($result) , ¿cubre realmente todos los casos, incluido el resultado vacío?

Al usar ->get() no puedes usar cualquiera de los siguientes:

 if (empty($result)) { } if (!$result) { } if ($result) { } 

Porque si dd($result); Notará que siempre se devuelve una instancia de Illuminate\Support\Collection , incluso cuando no hay resultados. Esencialmente, lo que está verificando es $a = new stdClass; if ($a) { ... } $a = new stdClass; if ($a) { ... } que siempre volverá verdadero.

Para determinar si hay resultados, puede hacer cualquiera de los siguientes:

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

También podría usar ->first() lugar de ->get() en el generador de consultas que devolverá una instancia del primer modelo encontrado, o null caso contrario. Esto es útil si necesita o está esperando solo un resultado de la base de datos.

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

Notas / Referencias

Información de bonificación

Las diferencias Colección y Creador de consultas pueden ser un poco confusas para los recién llegados de Laravel porque los nombres de los métodos a menudo son los mismos entre los dos. Por esa razón, puede ser confuso saber en qué está trabajando. El generador de consultas construye esencialmente una consulta hasta que llame a un método donde ejecutará la consulta y accedirá a la base de datos (por ejemplo, cuando llama a ciertos métodos como ->all() ->first() ->lists() y otros). Esos métodos también existen en el objeto Collection , que pueden obtenerse en el Query Builder si hay múltiples resultados. Si no está seguro de la clase con la que está trabajando, intente hacer var_dump(User::all()) y experimente para ver qué clases está regresando (con la ayuda de get_class(...) ). Le recomiendo que revise el código fuente de la clase Collection, es bastante simple. Luego, consulte el Query Builder y vea las similitudes en los nombres de las funciones y descubra cuándo realmente llega a la base de datos.

  • Laravel 5.2 Collection Class
  • Laravel 5.2 Query Builder

Creo que estás buscando:

 $result->isEmpty() 

Esto es diferente de empty($result) , que no será verdadero porque el resultado será una colección vacía. Su sugerencia de count($result) también es una buena solución. No puedo encontrar ninguna referencia en los documentos

Estoy de acuerdo con la respuesta aprobada anterior. Pero generalmente uso el método $results->isNotEmpty() como se indica a continuación.

 if($results->isNotEmpty()) { //do something } 

Es más detallado que if(!results->isEmpty()) porque a veces olvidamos agregar ‘!’ al frente, lo que puede ocasionar un error no deseado.

Tenga en cuenta que este método existe desde la versión 5.3 en adelante.

Hay varios métodos dados en Laravel para verificar el recuento de resultados / verificar vacío / no vacío:

 $result->isNotEmpty(); // True if result is not empty. $result->isEmpty(); // True if result is empty. $result->count(); // Return count of records in result. 

Creo que intentas algo como

  @if(!$result->isEmpty()) // $result is not empty @else // $result is empty @endif 

o también use

 if (!$result) { } if ($result) { } 

así que Laravel realmente devuelve una colección cuando solo usa Model::all(); no desea una colección, quiere una matriz para que pueda escribirla. (array)Model::all(); entonces puedes usar array_filter para devolver los resultados

 $models = (array)Model::all() $models = array_filter($models); if(empty($models)) { do something } 

esto también te permitirá hacer cosas como count() .

—— SOLUCIONADO ——

en este caso, desea verificar dos tipos de conteo para dos cace

caso 1:

si el resultado contiene solo un registro de otra palabra, seleccione una sola fila de la base de datos utilizando -> first ()

  if(count($result)){ ...record is exist true... } 

caso 2:

si el resultado contiene un conjunto de varias filas de otras palabras usando -> get () o -> all ()

  if($result->count()) { ...record is exist true... } 

Tu puedes hacer

 $result = Model::where(...)->count(); 

contar los resultados

También puedes usar

 if ($result->isEmpty()){} 

para verificar si el resultado está vacío o no.