Volver al blog Laravel

Beneficios de los Query Scopes en Laravel

Query Scopes encapsulan condiciones comunes en modelos Eloquent.

26 noviembre 2025

Los beneficios de los Query Scopes en Laravel

Introducción

En el desarrollo de aplicaciones modernas con Laravel, manejar consultas a la base de datos de forma eficiente y clara es clave para mantener un código limpio, reutilizable y fácil de mantener. Los Query Scopes, una potente característica del ORM Eloquent, permiten encapsular condiciones comunes dentro de los modelos, evitando la repetición y promoviendo la reutilización.

En esta nota técnica, exploramos sus beneficios, implementación y buenas prácticas, destacando cómo mejoran la calidad y escalabilidad del código.


¿Qué son los Query Scopes en Laravel?

Son métodos definidos en los modelos Eloquent que encapsulan fragmentos de consulta reutilizables. Se dividen en:

  • Local Scopes: Métodos aplicados sobre instancias del modelo, permiten crear filtros personalizados.
  • Global Scopes: Filtros automáticos que se aplican a todas las consultas del modelo, útiles para condiciones que deben persistir siempre.

Beneficios principales

  1. Reutilización de código: Evitan repetir condiciones 'where' o joins dispersos en controladores o repositorios, centralizando la lógica en un solo lugar.
  2. Legibilidad y mantenimiento: El nombre descriptivo del scope hace que las consultas sean semánticas y fáciles de entender.
  3. Encapsulamiento: Mantienen la lógica de consulta dentro del modelo, siguiendo el principio de responsabilidad única.
  4. Composición flexible: Permiten combinar múltiples scopes para construir consultas complejas de forma fluida.

Ejemplo práctico

Supongamos una aplicación de gestión de órdenes donde necesitamos filtrar órdenes pendientes y recientes. En lugar de repetir la lógica, definimos scopes en el modelo Order:

namespace App\Models;

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

class Order extends Model
{
    /**
     * Scope para órdenes pendientes.
     *
     * @param  Builder  $query
     * @return Builder
     */
    public function scopePending(Builder $query)
    {
        return $query->where('status', 'pending');
    }

    /**
     * Scope para órdenes creadas en los últimos N días.
     *
     * @param  Builder  $query
     * @param  int  $days
     * @return Builder
     */
    public function scopeRecent(Builder $query, int $days = 7)
    {
        return $query->where('created_at', '>=', now()->subDays($days));
    }
}
// Uso en un controlador
$recentPendingOrders = Order::pending()->recent(3)->get();

Aquí, pending() y recent() encapsulan la lógica, facilitando su uso y evitando duplicación.


Buenas prácticas para definir Query Scopes

  • Usa nombres claros y concisos para los scopes.
  • Documenta cada scope con su propósito y parámetros.
  • Permite parámetros para mayor flexibilidad.
  • Evita efectos secundarios; los scopes deben ser únicamente para consultas.
  • Combina scopes para mantener legibilidad sin sacrificar funcionalidad.

Conclusión

Los Query Scopes en Laravel son esenciales para crear aplicaciones escalables y fácilmente mantenibles. Centralizan la lógica de consultas, reducen errores, mejoran la colaboración y mantienen el código organizado. Aplicar esta técnica junto a principios SOLID, especialmente el de responsabilidad única, eleva la calidad arquitectónica del software.

Invito a la comunidad a integrar Query Scopes en sus proyectos para maximizar eficiencia y profesionalismo en el desarrollo con Laravel.