> Faqs > Desactivar un global scope cuando estamos en Nova

Desactivar un global scope cuando estamos en Nova

Tengo un problema al usar Laravel y Nova con los global scopes.

En un modelo tengo un campo que afecta a la visibilidad de ciertos elementos en la página. Es el modelo "Post", que tiene un flag visible (campo boleano) que, en caso de estar activo, entonces es que ese post no debe mostrarse.

Para conseguir que ciertos post no estén visibles en la página lo he solucionado con un Global Scope en el modelo de Laravel.

Esto es genial, porque en la página no tengo que andar siempre consultando qué posts están visibles todo el tiempo, simplemente si un post no está visible, no lo muestra nunca. Así me ahorro mantenimiento, porque este campo se introdujo a posteriori, y no tengo que revisar todo el código del sitio cambiando todas las consultas que recuperarn post a lo largo de la página.

Mi problema llega cuando me pongo a usar Nova para la administración de los posts. Simplemente me ocurre que todos los post que no están visibles, no se muestran en nova, porque está afectando también el global scope puesto en el modelo. Por supuesto, yo quiero poder seguir editando los post que no son visibles, porque quiero recuperarlos y activar o desctivar su visibilidad cuando sea necesario.

Lo suyo sería poder desactivar un global scope cuando estás en Nova, a fin de poder seguir administrando los post, tanto los visibles como los no visibles. ¿Qué puedo hacer para conseguirlo?

Respuestas

Sí a mi me ha pasado también, eso de que los global scopes me afecten en Nova... si los deseas desactivar puedes usar el método indexQuery() del resource de Nova.

Este método creo que está más bien hecho para otras cosas, como el filtrado, pero puedes meter aquí consultas que se ejecutan en el uso del recurso.

public static function indexQuery(NovaRequest $request, $query) {
    $query->withoutGlobalScopes();
}

Puedes usar NovaRequest de este namespace.

use Laravel\Nova\Http\Requests\NovaRequest;

Eso desactiva todos los scope globales que tengas en el recurso, lo que puede estar bien en muchos casos, pero a veces pasa que tienes como varios global scopes en el modelo y solamente quieres desactivar uno de ellos. Entonces haces algo como esto:

public static function indexQuery(NovaRequest $request, $query) {
    $query->withoutGlobalScope(PostVisibleScope::class);
}
Miguel Angel
3310 147 216 17