Saltar al contenido

En Laravel, los global scopes son una característica muy útil de Eloquent que te permiten añadir ciertas condiciones a todas las consultas de un modelo de forma automática. Sin embargo, en algunas situaciones querrás deshabilitar estos scopes para que no se apliquen en determinadas consultas, por ejemplo, en un Resource de Laravel Nova.

A continuación, veremos de manera clara:

  1. Qué es un global scope en Eloquent.

  2. Cómo deshabilitarlo directamente en nuestros modelos.

  3. Cómo deshabilitarlo en un Resource de Laravel Nova para que no afecte a las consultas que se realicen desde la interfaz de administración.


1. ¿Qué es un global scope en Eloquent?

En Eloquent, un global scope es una clase o closure que se registra en un modelo para modificar todas sus consultas de forma automática. Por ejemplo, el SoftDeletes utiliza un alcance global para excluir (por defecto) los registros “borrados” de las consultas.

Algunos ejemplos comunes de global scopes serían:

  • SoftDelete: Oculta los registros con la columna deleted_at cuando haces consultas select.

  • Scopes de negocio: Filtrar la información por usuario, roles, estado de publicación, etc.

Esto es muy práctico cuando necesitas que cada consulta a un modelo incluya siempre una condición adicional. Sin embargo, a veces quieres “saltarte” ese comportamiento para mostrar datos que normalmente se omiten o para simplificar la consulta en casos específicos (por ejemplo, en tu panel de administración).


2. Deshabilitar un global scope en Eloquent

2.1. El método withoutGlobalScope($scope)

Cuando necesites omitir un alcance específico en una consulta concreta, Eloquent proporciona el método withoutGlobalScope(). Por ejemplo, si tienes un global scope llamado PublishedScope, podrías hacer:

2.2. El método withoutGlobalScopes()

Si necesitas deshabilitar todos los global scopes para un modelo, utiliza:

De esta forma, obtendrás todos los registros, sin ninguna de las restricciones globales que hayas definido (incluyendo soft-deletes, si es que la tabla cuenta con esa característica).


3. Deshabilitar un global scope en Laravel Nova

Laravel Nova es el panel de administración oficial de Laravel. Cada modelo generalmente se representa con un Resource que define qué campos y acciones se mostrarán.

Aprende más acerca de Laravel Nova.

Por defecto, Nova respeta los global scopes definidos en el modelo. Esto significa que si tienes un scope que filtra ciertos registros, este se aplicará también en tu Resource de Nova. Pero, ¿qué hacer si quieres que Nova muestre todos los registros, incluyendo los que están ocultos por un scope?

3.1. Sobrescribir la consulta del índice con indexQuery()

Para lograrlo, en tu Resource (por ejemplo, app/Nova/Article.php), puedes sobrescribir el método indexQuery() e invocar withoutGlobalScopes(). Por ejemplo:

Con esto, cada vez que Nova necesite listar los registros en la vista “Index” de tu Resource, no se aplicarán los global scopes. Si solo necesitas omitir un scope específico, puedes reemplazar ->withoutGlobalScopes() por ->withoutGlobalScope(YourScope::class).

3.2. Consideraciones de seguridad y de lógica de negocio

  • Uso selectivo: Deshabilitar global scopes afecta la lógica de negocio que tal vez dependía de ellos (por ejemplo, mostrar únicamente registros “activos”). Asegúrate de que esto sea lo que realmente deseas en el panel de administración.

  • SoftDeletes: Si estás usando SoftDelete, al llamar a withoutGlobalScopes() en Nova, se mostrarán también los registros “borrados”. Podrías filtrar manualmente cuáles se exhiben si no quieres que aparezcan todos.


Conclusiones

Los global scopes en Eloquent son una herramienta poderosa para modificar todas las consultas a un modelo, pero a veces necesitas una vista “sin filtros”, especialmente en el panel de administración de tu aplicación con Laravel Nova.

  • A nivel de modelo, puedes usar métodos como withoutGlobalScope() o withoutGlobalScopes() para omitir uno o varios scopes en una consulta específica.

  • En Laravel Nova, basta con sobrescribir el método indexQuery() del Resource y agregar ->withoutGlobalScopes() (o el scope que quieras omitir) para que el panel de administración muestre todos los registros sin las restricciones globales.

De este modo, tendrás control total sobre qué datos se muestran en el entorno de administración y podrás manejar tu lógica de negocio sin restricciones indebidas.


Recursos Recomendados

school Curso completo

Curso Laravel 12
Completo 2026

El único curso 100% actualizado que incluye Laravel 12, Livewire 3, Vue 3, React 19 e Inertia 2. Aprende con proyectos reales y las últimas funcionalidades.

access_time 8 horas de contenido
layers 4 tecnologías en 1
update 100% actualizado
code Proyectos prácticos
Ver Curso Laravel 12 arrow_forward

star Incluido en cualquier suscripción

Rutas de aprendizaje