Colecciones en Laravel: Operaciones, Métodos y Buenas Prácticas

Video thumbnail

Las colecciones en Laravel no son nada nuevo para cualquiera que haya trabajado mínimamente con el framework. De hecho, las usamos casi sin darnos cuenta cada vez que recuperamos datos desde la base de datos con Eloquent. En mi caso, empecé a apreciarlas de verdad cuando dejé de tratar los resultados como simples arrays y empecé a encadenar operaciones directamente sobre ellos.

En este artículo voy a centrarme en las operaciones con colecciones en Laravel, explicando qué son, cómo se crean, qué métodos uso más en el día a día y qué buenas prácticas conviene seguir para evitar problemas de rendimiento o código innecesariamente complejo.

Qué son las colecciones en Laravel y por qué usarlas

Las colecciones en Laravel son, básicamente, arrays de PHP con esteroides. Internamente están implementadas mediante la clase:

Illuminate\Support\Collection

Pero lo importante no es la clase en sí, sino todo lo que nos permite hacer. Una colección es una envoltura sobre un array tradicional que añade una enorme cantidad de métodos para filtrar, transformar, agrupar, ordenar y reducir datos de forma mucho más expresiva.

En proyectos reales, trabajar con colecciones me ha permitido reducir bucles foreach, eliminar variables temporales y dejar la lógica mucho más clara. En lugar de decir cómo recorrer los datos, pasamos a decir qué queremos hacer con ellos.

Colecciones vs arrays en PHP

Aunque a nivel interno las colecciones se basan en arrays, la diferencia práctica es enorme:

Los arrays requieren bucles manuales, condiciones y más código.

Las colecciones permiten encadenar métodos y escribir código declarativo.

Por ejemplo, filtrar usuarios mayores de edad con arrays implica recorrer todo el conjunto. Con colecciones, basta con un filter() bien expresado. Además, la mayoría de los métodos de las colecciones no modifican el conjunto original, sino que devuelven una nueva colección, lo que reduce efectos secundarios y errores difíciles de detectar.

Cómo crear colecciones en Laravel

Colecciones devueltas por Eloquent

Las colecciones no son nada nuevo, hasta este momento hemos empleado las colecciones en los desarrollos anteriores, cada vez que teníamos una lista como respuesta de la base de datos para crear una tabla en una vista, se emplean colecciones.

El uso más habitual de colecciones lo tenemos cuando trabajamos con Eloquent. Cada vez que ejecutamos una consulta con get(), Laravel nos devuelve una colección:

Category::all();

Y esto es algo muy fácil de ver si imprimir el resultado anterior en modo debug o Tinker:

dd(Category::all());

Illuminate\Database\Eloquent\Collection 
  #items: array:N
}

Las colecciones en Laravel son una herramienta esencial en Laravel para manejar listados, pero, también podemos crear nuestras propias colecciones como veremos en este apartado.

Las colecciones no son más que los arrays de PHP pero con vitaminas, esto quiere decir a que son los mismos arrays pero con un conjunto de funcionalidades adicionales para que sean más fáciles y amigables su uso bajo la clase:

Illuminate\Support\Collection 

Crear colecciones manualmente con collect()

Además de las colecciones que vienen de Eloquent, podemos crear las nuestras a partir de arrays de PHP:

Aunque, esta clase no solamente es empleada de manera interna, también podemos emplearlo de manera manual, es decir, podemos crear una colección de un array en PHP:

$personas = [
        ["nombre" => "usuario 1", "edad" => 50],
        ["nombre" => "usuario 2", "edad" => 70],
        ["nombre" => "usuario 3", "edad" => 10],
];

Operaciones básicas con colecciones

Aquí es donde las colecciones empiezan a marcar la diferencia real frente a los arrays.

map()

map() transforma cada elemento de la colección y devuelve una nueva colección:

Para ello, tenemos varias formas:

use Illuminate\Support\Facades\Collection;
***
$collection1 = collect($personas);
//dd($collection1);
$collection2 = new Collection($personas);
//dd($collection2);
$collection3 = Collection::make($personas);
//dd($collection3);

filter() y reject()

filter() devuelve solo los elementos que cumplen una condición.

Con la colección, ahora es posible emplear métodos propios de la colección de todo tipo como el de filtro:

$collection2->filter(function($value,$key){
    return $value['edad'] > 17;
})

reject() hace justo lo contrario: elimina los elementos que cumplen la condición.

El cual, devuelve una colección de aquellos elementos que cumplan la condición, en este ejemplo en donde la edad sea mayor a 17:

Illuminate\Support\Collection {#5178
    all: [
      [
        "nombre" => "usuario 1",
        "edad" => 50,
      ],
      [
        "nombre" => "usuario 2",
        "edad" => 70,
      ],
    ],
  }

sum(), avg(), min(), max()

Uno de los grandes puntos fuertes de las colecciones es la facilidad para hacer operaciones agregadas.

Al devolver el método de filter() una colección, podemos encolar otras operaciones sobre colecciones como la de sumar:

$collection2->filter(function($value,$key){
    return $value['edad'] > 17;
})->sum('edad'));

Que en este caso, no devuelve una colección, sino un entero:

120

Este tipo de encadenamiento (filter()->sum()) es algo que uso muchísimo en código real.

pluck(), keys() y values()

pluck() permite extraer una propiedad concreta de todos los elementos:

$nombres = $collection->pluck('nombre');

También es muy común trabajar con las claves y valores de una colección usando keys() y values(), especialmente cuando tratamos colecciones con índices de tipo string.

Operaciones encadenadas en colecciones

Una de las mayores ventajas de las colecciones es que la mayoría de sus métodos devuelven otra colección, lo que permite encadenarlos.

Encadenar filtros y transformaciones

Por ejemplo:

$resultado = $collection
   ->filter(fn ($p) => $p['edad'] > 17)
   ->map(fn ($p) => $p['edad'])
   ->sort();

Este tipo de código es muy legible: se entiende de un vistazo qué está ocurriendo sin necesidad de seguir bucles internos.

Ejemplos reales de encadenamiento

En uno de mis casos más habituales, uso colecciones para limpiar resultados antes de enviarlos a una vista:

$users = User::all()
   ->filter->isActive()
   ->sortBy('name')
   ->pluck('email');

Aquí entran en juego también los Higher Order Messages, de los que hablaremos más adelante.

Operaciones intermedias y avanzadas

groupBy(), chunk() y partition()

groupBy() permite agrupar datos fácilmente:

$grouped = $collection->groupBy('edad');

chunk() es especialmente útil cuando trabajamos con colecciones grandes:

$collection->chunk(50)->each(function ($group) {
   // procesar grupos de 50 elementos
});

partition() divide una colección en dos según una condición, algo que resulta muy práctico para separar datos en dos bloques lógicos.

intersect(), merge() y concat()

Otro método interesante es el de intercepción que elimina cualquier valor de la colección original que no esté presente en el array suministrado:

$collection = collect(['Desk', 'Sofa', 'Chair']);
$intersect = $collection->intersect(['Desk']);

Y devuelve:

$collection->intersect(['Desk'])                                                                                               
= Illuminate\Support\Collection {#5118
    all: [
      "Desk",
    ],
  }

Este método me ha resultado especialmente útil para validar listas contra valores permitidos.

Higher Order Messages y colecciones perezosas

Simplificando código con Higher Order Messages

Laravel permite escribir código más limpio usando Higher Order Messages:

$users->each->markAsActive();

Esto evita funciones anónimas repetitivas y hace el código mucho más expresivo.

Lazy Collections y rendimiento

Cuando trabajamos con grandes volúmenes de datos, cargar todo en memoria no siempre es buena idea. Para estos casos, Laravel ofrece LazyCollection.

En importaciones masivas o lectura de archivos grandes, he comprobado que usar colecciones perezosas marca una diferencia enorme en consumo de memoria.

Buenas prácticas al trabajar con colecciones

Cuándo usar colecciones y cuándo no

Siempre que puedas, usa colecciones por claridad y expresividad. Sin embargo, si trabajas con datasets enormes, evalúa si la operación debe hacerse en la base de datos en lugar de en PHP.

Colecciones vs operaciones en base de datos

Un error común es hacer esto:

User::where('active', 1)->get()->sortBy('created_at');

Cuando sería mucho más eficiente:

User::where('active', 1)->orderBy('created_at')->get();

Este tipo de detalles marca la diferencia en aplicaciones con muchos registros.

Errores comunes y consejos prácticos

  • Encadenar demasiados métodos sin dividir el código.
  • Usar map() para efectos secundarios en lugar de each().
  • No aprovechar métodos existentes y reinventar la rueda.
  • Procesar en PHP lo que debería hacerse en SQL.

Preguntas frecuentes sobre colecciones en Laravel

  • ¿Qué son las colecciones en Laravel?
    • Son estructuras basadas en arrays que proporcionan métodos avanzados para manipular datos de forma expresiva.
  • ¿Cuál es la diferencia entre array y collection?
    • Las colecciones permiten encadenar métodos, mejorar la legibilidad y reducir errores comunes.
  • ¿Cuándo usar LazyCollection?
    • Cuando trabajas con grandes volúmenes de datos y quieres reducir el uso de memoria.
  • ¿Se pueden extender las colecciones?
    • Sí, mediante macros o creando clases personalizadas que extiendan Collection.

Conclusión

Las colecciones en Laravel son una de las herramientas más potentes del framework. Bien usadas, permiten escribir código más limpio, mantenible y expresivo. En mi experiencia, dominar las operaciones con colecciones marca un antes y un después en la forma de trabajar con datos en Laravel.

Si adoptas un enfoque funcional, aprovechas el encadenamiento de métodos y prestas atención al rendimiento, las colecciones se convertirán en una pieza clave de tu flujo de trabajo diario.

Estos métodos son propios de las colecciones, puedes revisar la documentación oficial para conocer la enorme cantidad de métodos que solamente tenemos disponibles al emplear las colecciones y que no existen con los arrays en:

https://laravel.com/docs/master/collections

Acepto recibir anuncios de interes sobre este Blog.

Aprende qué son las colecciones en Laravel, cómo crear y encadenar operaciones, métodos clave, ejemplos prácticos y buenas prácticas de rendimiento.

| 👤 Andrés Cruz

🇺🇸 In english