Eloquent: Macros en relaciones

¿Qué son las macros?

Las macros se utilizan en Laravel para darle nombre a ciertas operaciones. Normalmente se definen en un Service Provider para que estén disponibles en toda nuestra aplicación.

Si has utilizado colecciones conocerás el poder de las macros para hacer tu código más expresivo. Esto es, que sea legible como si fuera una historia dejando “escondidos” los detalles de implementación.

Este poder ha llegado a las relaciones para quedarse. Lo tenemos disponible desde la versión 5.4.8.

Vamos a ver el ejemplo que sirvió como presentación de esta característica. Jordan Pittman nos animaba en este tweet añadiendo a las relaciones uno a muchos la posibilidad de obtener un único registro.

Enséñame el código

Comenzamos creando nuestra aplicación con

Entramos en app/Providers/AppServiceProvider.php e introducimos el siguiente código:

Abrimos nuestra consola en la raíz del proyecto:

Creamos un nuevo modelo llamado login con una migración asociada:

Añadimos en la migración el campo del usuario

Para poder verlo en funcionamiento cambiamos nuestro fichero .env para poder trabajar con sqlite:

Borramos el resto de valores de DB_ para que no nos pregunte nada más y creamos la base de datos desde consola:

Añadimos la relación en el modelo de user app/User.php:

Y ahora vamos a probar que todo funciona como pensamos usando tinker, una consola que nos permite interactuar con toda nuestra aplicación:

Nota: En versiones de Laravel superiores a 5.4 Tinker es parte de un componente externo, el cual puedes instalar ejecutando composer require laravel/tinker  y agregando en el array de providers de config/app.php el provider de Tinker Laravel\Tinker\TinkerServiceProvider::class,

Creamos un usuario, un par de registros de logins y comprobamos que todo funciona como creemos.

Podríamos añadir otra macro que incluyera de forma automática el latest que hemos puesto antes para que la consulta que devolviera fuera ordenada de más nuevo a más antiguo. Entramos en app/Providers/AppServiceProvider y añadimos el siguiente código:

Y ahora podemos cambiar nuestro lastLogin en app/User.php (nuestro modelo User) por:

Y ver que todo funciona como antes usando tinker:

Ahora recuperamos nuestro usuario recién creado y vemos que lastLogin devuelve lo mismo que antes:

Nos encantará leer en los comentarios para que usarías macros en las relaciones. Anímate.

Comparte este artículo

Entra en la discusión y deja tu comentario

Veces