Optimización de consultas de bases de datos con los Query Scopes de Laravel

  • Publicado el 02 septiembre, 2024
  • Palabras: 491

Los query scopes de Laravel brindan una forma elegante de encapsular restricciones de consulta comunes, lo que hace que las consultas de la base de datos sean más legibles, reutilizables y fáciles de mantener. Veamos cómo puedes aprovechar los ámbitos de consulta en tus aplicaciones de Laravel.

Optimización de consultas de bases de datos con los Query Scopes de Laravel

#Query Scopes básicos

 

Para definir un query scope, escriba un método en el modelo con el prefijo ‘scope’:

 

class User extends Model
{
    public function scopeActive($query)
    {
        return $query->where('status', 'active');
    }
}

 

Ahora puedes usar este scope en tus consultas de este modo:

 

$activeUsers = User::active()->get();

 

#Scope con parámetros

 

Los scopes también pueden aceptar parámetros:

 

class Post extends Model
{
    public function scopePopular($query, $minViews)
    {
        return $query->where('views', '>', $minViews);
    }
}

// Uso
$popularPosts = Post::popular(1000)->get();

 

#Combinar múltipes scopes

 

Una de las ventajas de los query scopes es su componibilidad:

 

class Product extends Model
{
    public function scopeActive($query)
    {
        return $query->where('is_active', true);
    }

    public function scopeInStock($query)
    {
        return $query->where('stock', '>', 0);
    }

    public function scopeInCategory($query, $category)
    {
        return $query->where('category', $category);
    }
}

// Uso
$featuredElectronics = Product::active()
						->inStock()     
						->inCategory('electronics')
                        ->orderBy('featured', 'desc')
                        ->get();

 

#Scopes de ámbito global

 

Los scopes de ámbito global se aplican automáticamente a todas las consultas del modelo:

 

class User extends Model
{
    protected static function booted()
    {
        static::addGlobalScope('active', function (Builder $builder) {
            $builder->where('active', true);
        });
    }
}

// Nos devolverá solo los usuarios activos
$users = User::all();

 

También puedes definir un scope global como una clase separada:

 

class ActiveScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('active', true);
    }
}

class User extends Model
{
    protected static function booted()
    {
        static::addGlobalScope(new ActiveScope);
    }
}

 

#Eliminar scopes de ámbito global

 

Puedes eliminar un scope de ámbito global siempre que lo necesites:

 

User::withoutGlobalScope('active')->get();
// o
User::withoutGlobalScopes()->get();

 

#Scopes dinámicos

 

Puede crear scopes dinámicos para lograr la máxima flexibilidad:

 

class User extends Model
{
    public function scopeOfType($query, $type)
    {
        return $query->where('type', $type);
    }
}

// Uso
$users = User::ofType('admin')->get();

 

Los query scopes en Laravel ofrecen una forma eficaz de encapsular la lógica de consulta, lo que promueve un código más limpio y fácil de mantener. Al aprovechar los scopes, puedes crear consultas expresivas y reutilizables que hacen que las interacciones de la base de datos de su aplicación sean más sólidas y fáciles de entender.

Antonio Jenaro

Antonio Jenaro

Web Developer

Fuente: Harris Raftopoulos

Comentarios (1)

Roberto Millán Roberto Millán

Buen aporte 😉

Inicia la conversación

Hazte miembro de Antonio Jenaro para comenzar a comentar.

Regístrate ahora

¿Ya estás registrado? Inicia sesión