Índice de Blog
Laravel 3 MIN READ Manuel Cordón

Ámbitos globales (Global Scopes) de Laravel: filtrado automático de consultas

Los Global Scopes de Laravel aplican filtros automáticos a todas las consultas de un modelo Eloquent. Te enseñamos cómo definirlos, casos de uso reales (multi-tenant, soft deletes, restricciones por usuario) y buenas prácticas para mantener un código limpio y seguro.

Imagen destacada del artículo: Ámbitos globales (Global Scopes) de Laravel: filtrado automático de consultas

Laravel se ha posicionado como uno de los frameworks más versátiles y robustos del ecosistema PHP, siendo una elección clave para proyectos que buscan escalabilidad, seguridad y eficiencia. En el núcleo de su arquitectura, los global scopes destacan como una herramienta que no solo simplifica el código, sino que transforma la forma en que se gestionan las consultas a bases de datos. Gracias a ellos, cada interacción con los datos es precisa, coherente y alineada con las reglas de negocio del proyecto.

¿Te imaginas un sistema donde no tengas que preocuparte por añadir filtros manualmente a cada consulta? Laravel lo hace posible: esta funcionalidad permite definir restricciones globales a nivel de modelo que se aplican automáticamente. Es como tener un filtro inteligente que actúa en segundo plano, ayudando a mantener la integridad y seguridad del sistema sin esfuerzo adicional.

En este artículo, exploraremos cómo los global scopes ofrecen control total sobre las consultas, cómo se implementan y en qué casos resultan especialmente útiles. Veremos ejemplos prácticos, buenas prácticas y cómo sacar el máximo provecho de esta poderosa característica para mejorar la calidad de tus desarrollos en Laravel.

¿Qué son los Global Scopes?

Los global scopes en Laravel permiten aplicar restricciones automáticas a todas las consultas de un modelo Eloquent determinado. Por ejemplo, la funcionalidad de soft deletes (SoftDeletes) es en realidad un global scope que filtra automáticamente los registros marcados como eliminados.

Ejemplo básico: filtrar registros activos

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

Y en el modelo:

php
#[ScopedBy([ActiveScope::class])]
class Product extends Model
{
    protected $fillable = ['name', 'price', 'is_active'];
}

Global Scopes para entornos multi-tenant

Uno de los escenarios más comunes para usar global scopes es en aplicaciones multi-tenant, donde los datos de cada inquilino (tenant) deben permanecer completamente aislados:

php
class TenantScope implements Scope
{
    public function apply(Builder $builder, Model $model): void
    {
        if (auth()->check() && auth()->user()->tenant_id) {
            $builder->where('tenant_id', auth()->user()->tenant_id);
        }
    }
}

Se pueden combinar múltiples scopes, por ejemplo, filtrando además por estado de publicación:

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

Modelo completo:

php
#[ScopedBy([TenantScope::class, PublishedScope::class])]
class Document extends Model
{
    protected $fillable = ['title', 'content', 'status', 'tenant_id', 'published_at'];

    protected $casts = [
        'published_at' => 'datetime',
    ];
}

Control avanzado: omitir global scopes

Laravel permite desactivar global scopes cuando sea necesario:

php
Document::withoutGlobalScope(PublishedScope::class)->get();
Document::withoutGlobalScopes()->get();

Esto es útil para paneles de administración, reportes o tareas internas que necesitan acceso total a los datos, sin filtros automáticos.

Ventajas de utilizar Global Scopes

  • Centralización de la lógica de negocio
  • Menor repetición de condiciones en el código
  • Mayor consistencia en los resultados
  • Refuerzo automático de reglas de seguridad y aislamiento
  • Ideal para entornos multi-tenant, moderación de contenido, y visibilidad contextual

Conclusión

Los Global Scopes en Laravel son una herramienta esencial para cualquier desarrollador que busque equilibrio entre simplicidad y control. Permiten filtrar datos automáticamente sin complicar el código, garantizando la coherencia y seguridad de forma automática.

Además de ahorrar tiempo, fomentan un desarrollo más limpio y preparado para escalar. Su uso refleja la filosofía de Laravel: ofrecer herramientas elegantes que resuelvan problemas reales sin sobrecargar la arquitectura del proyecto.

MC

Escrito por Manuel Cordón

Lead developer y partner manager de Laravel. Lead developer especializado en Laravel, PHP moderno y arquitecturas orientadas a dominio. Responsable de la práctica Laravel en 10Code, partner oficial de Laravel en España, y autor habitual del blog técnico del equipo.

Artículos_relacionados