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
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.
Reutilización: Los métodos de la colección pueden ser utilizados en cualquier parte de la aplicación.
Mantenibilidad: Es más fácil mantener y modificar la lógica cuando está centralizada en un solo lugar.
Encadenamiento: Podemos encadenar métodos de colección para operaciones más complejas.
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!
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.
star Incluido en cualquier suscripción