Query Scopes

15/17

Lectura

Otra de las posibilidades que tenemos con los modelos es que podemos definir el alcance de las operaciones que realicemos con los modelos a través de los Scopes.

Esto quiere decir que podemos restringir la cantidad o los valores que nuestro modelo retornará a una condición específica. Un caso de uso para los Query Scopes sería, por ejemplo, si quisiéramos restringir la consulta de datos a solo los que tengan el project_id mayor a 100, esto quiere decir que aún si se consultan todos los registros de la tabla projects a través del modelo Project, se le listarán todos los proyectos con project_id mayor a 100 y los 100 primeros no aparecerán aún cuando estén activos y existentes en la tabla.

Por supuesto, son más los aspectos en los cuales los podemos usar, pero también dependerá de ciertas condiciones que nos de el proyecto en el cual estemos trabajando.

Global Scopes 🌎

Los Scopes Globales los encontramos como archivos que están aparte, en su implementación más básica, generalmente están en la carpeta App/Scopes y se componen de una estructura como esta:

namespace App\Scopes;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;

class AgeScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('age', '>', 200);
    }
}

Este ejemplo se implementaría llamando este Scope en nuestro controlador, su función apply recibe dos parámetros, el primero es el builder o la sentencia que escribimos para ejecutar acciones (el código que usamos para realizar acciones sin usar SQL) y luego el modelo, lo que hará este método será agregarle a la sentencia del builder la condición de que la edad sea mayor a 200 (para efectos de este ejemplo).

Local Scopes 🖼

Podemos tener Scopes locales, este lo agregamos en forma de una función dentro del modelo y lo anexamos directamente a la consulta cuando se vaya a realizar, por ejemplo:

public function scopeActive($query) {
    return $query->where('is_active', 1);
}

Si implementamos esta función y la llamamos en ProjectController justo cuando estamos haciendo una consulta de datos, nos agregará por debajo la condición de que sólo traerá registros cuyo valor en el campo is_active sea igual a 1.

La forma de implementarlo sería la siguiente:

Project::active()->get();

Puedes usar Global Scope o Local Scope dependiendo de tu necesidad, yo te recomendaría que lo hagas cuando sea necesario y de manera local (o sea, dentro del modelo), de esta forma tendrás un control más personalizado del ámbito en el cual controlas tus datos.

En la siguiente clase conocerás sobre una herramienta que nos permite crear consultas e interactuar con la base de datos de una manera más limpia y segura llamada Query Builder.

Aportes 8

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Interesante la explicación del global Scope, les recomiendo ver un ejemplo de implementación.

Interesante, en resumen, lo que hacen estas query’s scopes es anexar más condiciones a la consulta original, pero las anexara siempre que requieras usar el modelo, de esa forma le hace el filtro a absolutamente todas las consultas que hagas para dicho modelo, puede llegar a ser útil en casos particulares

Generalmente utilizó los Local Scope, creo que sólo en una ocasión necesite de un GlobalScope, pero el más común que he utlizado es crear un Global Scope para un campo published_at de tipo datetime, se vuelve muy útil. Lo que hace es que evalua que sólo publique aquellos registros que NO tengan fechas futuras.

namespace App\Scopes;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;

class PublishedScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('published_at', '<=', \Carbon\Carbon::now());
    }
}

Scope o alcances es el nivel de funcionalidad de nuestra clase, variable o metodo hasta donde puede funcionar

Los Query Scopes permiten limitar la información que ven los usuarios de la App, si así lo hemos programado.

Genial, se me ocurre que se pueden usar para listar los registros con status_id = 1 (activos) y no tener que hacer un where en cada acción de controlador, excelente herramienta

Un ejemplo sencillo de un Scope es enviar los ids de un modelo que no se quieren buscar:

Local Scope esta brutal me gusto mucho y expandió mi mente para tenerlo presente