Saltar al contenido

Las colecciones son una de las características más potentes de Laravel, y con la llegada de Laravel 11, tenemos una nueva forma más elegante de implementar colecciones personalizadas sobre modelos Eloquent usando el atributo #[CollectedBy]. En este artículo, vamos a explorar cómo crear y utilizar colecciones personalizadas con un ejemplo práctico y completo.

Evolución de las Colecciones Eloquent Personalizadas en Laravel

Antes de Laravel 11, la forma tradicional de implementar una colección personalizada en Eloquent era sobrescribiendo el método newCollection() en el modelo:

Este enfoque, aunque funcional, tenía algunas limitaciones:

  • Requería añadir código adicional en cada modelo

  • No era inmediatamente obvio que el modelo usaba una colección personalizada

  • Era más difícil para las herramientas de análisis estático detectar la relación entre el modelo y su colección

Laravel 11 introduce el atributo #[CollectedBy] como una solución más elegante y declarativa, siguiendo las tendencias modernas de PHP de usar atributos para la metaprogramación. Esta nueva sintaxis hace que el código sea más limpio y más fácil de entender a primera vista.

⚠️ Nota Importante

Antes de profundizar, es crucial entender la diferencia entre Colecciones Personalizadas y otros métodos de filtrado en Laravel:

  • Builders y Scopes: Filtran los datos a nivel de base de datos ANTES de obtenerlos. Por ejemplo, Recipe::where('is_vegetarian', true)->get() solo traerá de la base de datos las recetas vegetarianas.

  • Colecciones Personalizadas: Operan sobre los datos DESPUÉS de haberlos obtenido de la base de datos. Por ejemplo, $recipes->vegetarianOptions() filtrará las recetas vegetarianas de una colección que ya existe en memoria.

¿Qué son las Colecciones Personalizadas?

Las colecciones personalizadas nos permiten extender la funcionalidad de las colecciones de Eloquent añadiendo métodos específicos para nuestro dominio. Esto nos ayuda a:

  • Encapsular lógica de transformación de datos

  • Mantener el código DRY (Don't Repeat Yourself)

  • Mejorar la legibilidad del código

  • Hacer el código más mantenible

Ejemplo Práctico: Sistema de Gestión de Recetas

Vamos a crear un sistema completo de gestión de recetas para mostrar el poder de las colecciones personalizadas.

1. Creando los recursos necesarios

Primero de todo, vamos a crear todo lo que necesitamos de base, que es una migración, un modelo, una factoría y un seeder.

2. Creando la Migración

A continuación, creamos la estructura de nuestra base de datos:

3. Creando el Modelo

Ahora, definimos nuestro modelo con el nuevo atributo #[CollectedBy]:

4. Creando la Colección Personalizada

Este es el corazón de nuestra implementación. Aquí es donde definimos toda la lógica personalizada para manejar nuestras recetas:

5. Creando la Factory

Para poder probar nuestro sistema, necesitamos datos de prueba:

6. Creando el Seeder

Los seeders en Laravel nos ayudan a registrar datos en nuestra base de datos, normalmente en tiempo de desarrollo, hagámoslo:

Probando la Implementación

Vamos a ver algunos ejemplos prácticos de cómo usar nuestra colección personalizada utilizando Laravel Tinker:

Ventajas de Usar Colecciones Personalizadas

  1. Código más limpio: Al mover la lógica de transformación a la colección, nuestros controladores y modelos quedan más limpios.

  2. Reutilización: Los métodos de la colección pueden ser utilizados en cualquier parte de la aplicación.

  3. Mantenibilidad: Es más fácil mantener y modificar la lógica cuando está centralizada en un solo lugar.

  4. Encadenamiento: Podemos encadenar métodos de colección para operaciones más complejas.

  5. Testing: Es más fácil testear la lógica de transformación cuando está aislada en la colección.

Casos de Uso Prácticos

Las colecciones personalizadas son especialmente útiles cuando:

  • Necesitas transformar datos para una API

  • Tienes lógica de filtrado compleja

  • Requieres formatos específicos para diferentes vistas

  • Necesitas realizar cálculos o agregaciones comunes

  • Quieres estandarizar la forma en que se presentan los datos

Conclusión

Las colecciones personalizadas con el nuevo atributo #[CollectedBy] en Laravel 11 nos proporcionan una forma elegante y poderosa de organizar la lógica de transformación de nuestros datos. Al utilizarlas correctamente, podemos hacer nuestro código más mantenible, reutilizable y limpio.

¿Ya estás usando colecciones personalizadas en tus proyectos? ¿Qué otros métodos útiles se te ocurren para este ejemplo? Si te ha resultado útil la entrada, compártela con tus colegas.

¿Quieres seguir profundizando en las últimas novedades de Laravel?

No te pierdas nuestra ruta de Laravel 11, donde exploramos las funciones más recientes del framework, prácticas avanzadas y consejos para optimizar tus proyectos. ¡Te esperamos allí para que lleves tus aplicaciones al siguiente nivel!

school Curso completo

Curso Laravel 12
Completo 2026

El único curso 100% actualizado que incluye Laravel 12, Livewire 3, Vue 3, React 19 e Inertia 2. Aprende con proyectos reales y las últimas funcionalidades.

access_time 8 horas de contenido
layers 4 tecnologías en 1
update 100% actualizado
code Proyectos prácticos
Ver Curso Laravel 12 arrow_forward

star Incluido en cualquier suscripción

Rutas de aprendizaje