Scopes en Laravel: consultas Eloquent reutilizables

Scopes en Laravel: consultas Eloquent reutilizables
Los scopes de Laravel resultan muy prácticos cuando tienes que consultar los mismos datos varias veces. Además hacen que tus consultas sean más fáciles de leer y de mantener.

Si no conoces los scopes de Laravel, este es tu tutorial 😉 .

Qué son los scopes

En Laravel hay dos tipos de scopes (globales y locales). Para no complicarlo, aquí solo cubro los scopes locales, aun así, échale un vistazo a los scopes globales cuando tengas ocasión.

Entonces, ¿qué es un local scope en Laravel? Me alegra que lo preguntes. Aquí tienes un ejemplo de scope local dentro de un modelo de usuario:

php
<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class User extends Model
{
    public function scopeAdmin($query)
    {
        return $query->where('admin', 1);
    }
}

En el ejemplo de código anterior puedes ver que tenemos el método scopeAdmin, que devuelve una $query donde la columna admin vale 1. Ahora que ya has visto un ejemplo de scope local, vamos a aprender a usarlo.

Cómo usar los scopes

Si quieres usar nuestro scopeAdmin dentro del proyecto para obtener una colección de usuarios admin, basta con escribir esto:

php
$admins = User::admin()->all();

Con eso obtenemos todos los admin de la base de datos.

Con suerte ya ves lo potentes que son y cómo los scopes te ahorran tiempo y hacen tu código más legible. Si todavía no te convencen, sigue leyendo para ver un ejemplo de cómo pueden facilitarte la vida.

Por qué usar los scopes

Retomando los ejemplos anteriores, supongamos que queremos modificar la consulta para que solo devuelva los admin cuya columna active vale 1. Si no usáramos scopes en la aplicación, tendríamos que buscar esta consulta por todo el código:

php
$admins = User::where('admin', 1)->all();

Y sustituirla por:

php
$admins = User::where('admin', 1)->where('active', 1)->all();

En cambio, usando scopes basta con modificar el scope así:

php
public function scopeAdmin($query)
{
    return $query->where('admin', 1)->where('active', 1);
}

Y todas las consultas existentes devolverán los usuarios admin cuyo active vale 1. Como ves, tu código gana en eficacia y es más fácil de mantener y de leer.

Conclusión

Usar scopes en tu aplicación Laravel lleva la lógica a los modelos Eloquent en lugar de dejarla directamente en las vistas y los controladores. Eso hace que el proyecto sea más fácil de mantener y de leer.

Espero que este artículo te haya servido para entender mejor los scopes de Laravel y que los uses en tus próximos proyectos ✌️.

Laravel

Damien Flandrin Desarrollador web desde 2010, creador de Gekkode y de Email Impact. Cada artículo se prueba en un proyecto real antes de publicarse. Contacto
Newsletter

Las nuevas pruebas, tutoriales y proyectos, por correo.

Pruebas reproducibles, código versionado, resultados fechados. Nunca spam.