Colección elocuente: contar y detectar vacíos
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 !$result
para detectar resultados vacíos, ¿es suficiente? En cuanto a count($result)
, ¿cubre realmente todos los casos, incluido el resultado vacío?
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\Collection
siempre 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 null
de 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_firstisEmpty()
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_countcount($result)
funciona porque la Colección implementa Countable y uncount()
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 Collection
objeto, 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
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.
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.