Colección elocuente: contar y detectar vacío


272

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

Actualmente estamos utilizando !$resultpara detectar resultados vacíos, ¿es eso suficiente? En cuanto a count($result), ¿cubre realmente todos los casos, incluido el resultado vacío?

Respuestas:


581

Cuando lo use, ->get()no puede simplemente usar ninguno de los siguientes:

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

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

Para determinar si hay algún resultado, puede hacer lo siguiente:

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

También puede usar en ->first()lugar de ->get()en el generador de consultas que devolverá una instancia del primer modelo encontrado, o de lo nullcontrario. Esto es útil si necesita o espera un solo resultado de la base de datos.

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

Notas / Referencias

Información de bonificación

Las diferencias de Collection y Query Builder pueden ser un poco confusas para los recién llegados de Laravel porque los nombres de los métodos son a menudo los mismos entre los dos. Por esa razón, puede ser confuso saber en qué estás trabajando. El generador de consultas esencialmente crea una consulta hasta que llame a un método donde ejecutará la consulta y golpeará 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 Collectionobjeto, que se pueden devolver desde el generador de consultas si hay varios resultados. Si no está seguro de en qué clase está trabajando realmente, intente hacer var_dump(User::all())y experimentar para ver qué clases está regresando realmente (con la ayuda deget_class(...)) Le recomiendo que consulte el código fuente de la clase Collection, es bastante simple. Luego, consulte el generador de consultas y vea las similitudes en los nombres de las funciones y descubra cuándo llega realmente a la base de datos.


44
gracias, solo para agregar que si ejecuta una consulta first(), el resultado es diferente de get(), lo que puede verificarse !$resultcomo un resultado vacío esnull
bitinn

2
@btinn sí, si lo hizo, es decir Model::first(), en realidad está actuando sobre el 'primer' método del generador de consultas y NO de la colección, por lo tanto, elegirá el primero de la base de datos; sin embargo Model::get(), devolverá una instancia de Illuminate \ Support \ Colección así que si lo hiciste $r = Model::get()y luego $r->first()seleccionará el primer elemento dentro de esa colección.
Gary Green

Una cosa que esta respuesta no aborda es si count($result)funciona; agregar ese detalle sería una mejora.
Mark Amery

¿Cuál es la diferencia entre $ result-> count y count ($ result) ¿$ result-> count vuelve a golpear la base de datos? Si no, supongo que son lo mismo.
Kamy D

2
@pathros No hay una manera simple de hacerlo. Tendría que recorrer en iteración cada miembro de la colección usando un foreachbucle y luego usar una de estas comprobaciones (piense:) count($collection->column).
PapaHotelPapa

71

Creo que estás buscando:

$result->isEmpty()

Esto es diferente de empty($result), lo que no será cierto 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


1
¿Qué tal cuando solo uno quiere verificar si una columna específica (propiedad) como en $ collection-> column está vacía / nula o no?
Pathros

13

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

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

Es más detallado que if(!results->isEmpty())porque a veces nos olvidamos de agregar '!' en el frente, lo que puede provocar un error no deseado.

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


4

Hay varios métodos dados en Laravel para verificar el conteo 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.

4

Creo que mejor usar

$result->isEmpty();

El método isEmpty devuelve verdadero si la colección está vacía; de lo contrario, se devuelve falso.


3

Creo que intentas algo como

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

o también usar

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

2

Tu puedes hacer

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

para contar los resultados.

También puedes usar

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

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


1

De acuerdo con los estados de Laravel Documentation , puede usarlo de esta manera:

$result->isEmpty();

El isEmptymétodo regresa truesi la colección está vacía; de lo contrario, falsese devuelve.


0

por lo que Laravel en realidad devuelve una colección cuando solo usando Model::all(); no quieres una colección, quieres una matriz para que puedas escribir set it. (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().


3
mantenerlo como una colección es realmente conveniente para que los objetos devueltos puedan heredar muchas funciones útiles en la fachada de la colección.
Gokigooooks

0

------ RESUELTO ------

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

caso 1:

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

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

caso 2:

si el resultado contiene un conjunto de varias filas, otra palabra usando -> get () o -> all ()

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.