Colección elocuente: contar y detectar vacíos

Resuelto bitinn asked hace 10 años • 13 respuestas

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

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

bitinn avatar Dec 13 '13 16:12 bitinn
Aceptado

Al usarlo ->get(), no puede simplemente usar cualquiera de los siguientes:

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

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

Para determinar si hay algún resultado, puede realizar cualquiera de las siguientes acciones:

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

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

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

Notas / Referencias

  • ->first() http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_first
  • isEmpty() http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_isEmpty
  • ->count() http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_count
  • count($result)funciona porque la Colección implementa Countable y un count()método interno: http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_count

Información de bonificación

Las diferencias entre la Colección y el Generador de consultas pueden resultar un poco confusas para los recién llegados a Laravel porque los nombres de los métodos suelen ser los mismos entre los dos. Por esa razón, puede resultar confuso saber en qué estás trabajando. Básicamente, el Generador de consultas crea una consulta hasta que usted llama a un método donde ejecutará la consulta y llegará a la base de datos (por ejemplo, cuando llame a ciertos métodos como ->all() ->first() ->lists()y otros). Esos métodos también existen en el Collectionobjeto, que pueden ser devueltos por el Generador de consultas si hay varios resultados. Si no está seguro de con qué clase está trabajando realmente, intente hacer var_dump(User::all())y experimentar para ver qué clases realmente está devolviendo (con la ayuda de get_class(...)). Le recomiendo encarecidamente que consulte el código fuente de la clase Colección, 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.

  • Clase de colección Laravel 5.2
  • Generador de consultas Laravel 5.2
Gary Green avatar Dec 14 '2013 16:12 Gary Green

Creo que estás buscando:

$result->isEmpty()

Esto es diferente de empty($result), 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.

clod986 avatar Dec 13 '2013 10:12 clod986

Acepto la respuesta aprobada anteriormente. Pero normalmente uso $results->isNotEmpty()el método que se indica a continuación.

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

Es más detallado if(!results->isEmpty())porque a veces nos olvidamos de agregar '!' delante, lo que puede provocar errores no deseados.

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

sathish R avatar Jun 02 '2017 07:06 sathish R