Skip to main content

Qué son las colecciones

La clase Illuminate\Support\Collection es un envoltorio fluido para trabajar con arrays. En lugar de invocar por separado las funciones nativas de arrays de PHP, permite transformar los datos de manera intuitiva encadenando métodos.
Las colecciones son inmutables. Cada método devuelve una nueva instancia sin modificar la colección original, de modo que puedes operar con seguridad sin perder los datos de partida.

Crear una colección

Helper collect()

Es la forma más habitual. Pasa un array y obtén una colección.

Collection::make()

Equivalente a collect(). Úsalo cuando prefieras un estilo tipo facade.

Collection::fromJson()

Crea una colección a partir de una cadena JSON. Útil para procesar respuestas de APIs externas.

Métodos más habituales

map: transformar cada elemento

Aplica una operación a cada elemento y devuelve una nueva colección con los valores transformados.

filter / reject: filtrar por condición

filter() conserva los elementos que cumplen la condición; reject() descarta los que la cumplen.
Tras filter() los índices pueden quedar con huecos. Llama a values() para reindexar desde 0.

first / last: obtener un elemento

Devuelve el primer o el último elemento que cumple la condición.

pluck: extraer una clave concreta

Extrae únicamente un campo de arrays o modelos anidados.

groupBy: agrupar por una clave

sortBy / sortByDesc: ordenar

each: ejecutar código sobre cada elemento

Úsalo para operaciones con efectos secundarios (logs, envío de correos, etc.). No modifica la colección.

flatMap: mapear y aplanar un nivel

Convierte cada elemento en un array y aplana el conjunto a una sola dimensión.

reduce: agregar

Reduce toda la colección a un único valor.
Para sumas sencillas puedes usar sum(): $orders->sum(fn ($o) => $o['price'] * $o['quantity']).

reduceInto: agregar sobre un objeto

Se comporta como reduce, pero la callback no necesita devolver un valor. Es útil para modificar directamente un objeto existente.
En reduce el retorno de la callback se convierte en el siguiente $carry, por lo que encaja bien con la agregación de valores primitivos. En reduceInto se muta directamente un objeto, dando lugar a un código más simple.
Para agregar sobre un escalar o un array, utiliza el paso por referencia (&) en la callback.

chunk: dividir en trozos

Divide una colección grande en fragmentos del tamaño indicado. Es útil para procesamiento por lotes o para paginar en pantalla.

Encadenamiento de métodos

La verdadera potencia de las colecciones está en el encadenamiento. Puedes expresar transformaciones complejas de datos en una sola secuencia.

Integración con Eloquent

Los resultados de las consultas de Eloquent siempre son instancias de Illuminate\Database\Eloquent\Collection. Esta clase extiende la Collection base, así que todos los métodos vistos están disponibles.
El filtrado y la ordenación que pueda hacer la base de datos deben resolverse en el query builder (where, orderBy, etc.), no en la colección. Si filtras después de convertir a colección, cargarás en memoria todos los datos innecesarios.

Métodos propios de la colección de Eloquent

Eloquent\Collection añade métodos específicos.

Lazy Collections

Mientras que una colección normal carga en memoria todos los datos, LazyCollection aprovecha los generadores de PHP y procesa los elementos uno a uno. Permite ahorrar memoria cuando trabajas con decenas de miles de registros.

Crear una LazyCollection

Procesamiento por lotes de grandes volúmenes

cursor() recupera los registros uno a uno de la base de datos, con lo que ahorra mucha memoria al procesar grandes cantidades. Ten en cuenta, sin embargo, que la conexión con la base de datos se mantiene activa hasta que finaliza el procesamiento.

Paginado con take y skip

Resumen

Las colecciones aportan mucha más legibilidad que las funciones de array.
  • Colección normal: datos del orden de cientos o miles de elementos. Sencilla e intuitiva.
  • LazyCollection: grandes volúmenes (decenas de miles o más) donde interesa ahorrar memoria. Combínala con cursor() para obtener el máximo rendimiento.
  • get() de Eloquent devuelve una colección normal; cursor() devuelve una LazyCollection.
Última modificación el 13 de julio de 2026