Los alcances de Laravel-Lighthouse no se actualizan

Tengo una consulta en Lighthouse que está usando @paginate alcance con otros 3 ámbitos

Esta es mi consulta

profiles(where: _ @whereConditions(columns: ["email"])): [User!]! @paginate(scopes: ["byOrganizationLoggedIn","byMatchingRole", "byAvailableMatching"]) @middleware(checks: ["auth:api"])

Y esos son mis alcances de la entidad Usuario.

   /**
     * @param [type] $query
     */
    public function scopeByOrganizationLoggedIn($query)
    {
        if ($organization = request()->user()->organization_id) {
            $query->where('organization_id', $organization);
        }
    }

    /**
     * @param [type] $query
     */
    public function scopeByMatchingRole(Builder $query)
    {
        if (request()->user()) {
            $query->whereHas('roles', function ($q) {
                $q->whereIn('name', ['Mentor', 'Mentee']);
            });
        }
    }

    /**
     * @param [type] $query
     */
    public function scopeByAvailableMatching(Builder $query)
    {
        if (request()->user()) {
            $query->whereDoesntHave('matchedProfiles', function (Builder $q) {
                $q->where('user_id', request()->user()->id);
            });
        }
    }

El problema es que mi último alcance byAvailableMatching no se llama y si quito uno de los otros ámbitos byOrganizationLoggedIn o byMatchingRole sigue entrando en los métodos de la entidad.

He intentado restablecer el caché de faro usando

php artisan lighthouse:clear-cache

Pero la consulta y los alcances no se actualizan y están devolviendo los mismos datos.

Soy nuevo en Laravel y Lighthouse y si tienes alguna sugerencia para filtrar la consulta por todos los ámbitos házmelo saber.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por logicluminary3c42


2 Respuestas:

  • Para asegurarte de que los alcances definidos en tu modelo de Usuario se están aplicando correctamente en tu consulta de Lighthouse, puedes intentar lo siguiente:

    • Orden de aplicación de los alcances: En Laravel, el orden en el que se aplican los alcances puede ser importante. Asegúrate de que estás definiendo los alcances en el modelo en un orden que tenga sentido para tus requerimientos. En tu caso, parece que el alcance `byAvailableMatching` debería aplicarse después de los otros dos alcances. Puedes ajustar el orden de aplicación en tu consulta de Lighthouse.
    • Verificar la lógica de los alcances: Revisa la lógica en cada uno de tus alcances para asegurarte de que están funcionando como esperas. Puedes probar cada uno de los alcances individualmente en un entorno de prueba para confirmar su funcionamiento.
    • Utilizar parámetros opcionales: Puedes considerar hacer algunos ajustes en tus alcances para que sean más flexibles en su aplicación. Por ejemplo, puedes hacer que los alcances actúen de manera condicional dependiendo de si están presentes ciertos parámetros en la consulta de Lighthouse.
    • Revisar la configuración de Lighthouse: Asegúrate de que la configuración de Lighthouse en tu proyecto esté correctamente establecida y que esté reconociendo los alcances definidos en los modelos de Eloquent.

    Si después de revisar estos puntos todavía experimentas problemas con la aplicación de tus alcances en Lighthouse, considera crear un endpoint de prueba en tu API para verificar manualmente la aplicación de los alcances en tus consultas antes de utilizar Lighthouse. Esto puede ayudarte a identificar si el problema está en la definición de los alcances o en la integración con Lighthouse.

    Espero que estas sugerencias te sean útiles para solucionar el problema que estás experimentando. ¡Déjame saber si tienes alguna otra duda o si necesitas más ayuda!

    Respondida el Dec 19, 2020 a las 07:08 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Resolución del problema:

    El problema es que el método byAvailableMatching no se llama porque el alcance whereDoesntHave requiere que la consulta coincida con todos los criterios proporcionados. En tu caso, la consulta está filtrando por OrganizationLoggedIn y MatchingRole, por lo que byAvailableMatching nunca se llama.

    Para resolver este problema, puedes utilizar el alcance whereHas en su lugar. whereHas coincidirá con los registros que tienen una relación correspondiente que coincida con los criterios proporcionados.

    Consulta actualizada:

    
    profiles(where: _ @whereConditions(columns: ["email"])): [User!]! @paginate(scopes: ["byOrganizationLoggedIn","byMatchingRole", "byAvailableMatching"]) @middleware(checks: ["auth:api"])
    

    Alcance actualizado:

    
    public function scopeByAvailableMatching(Builder $query)
    {
        if (request()->user()) {
            $query->whereHas('matchedProfiles', function (Builder $q) {
                $q->where('user_id', '!=', request()->user()->id);
            });
        }
    }
    

    Explicación:

    El alcance byAvailableMatching ahora usa whereHas para verificar si un usuario no tiene ninguna relación matchedProfiles con el usuario actualmente conectado. Esto garantiza que el alcance se aplique correctamente después de filtrar por byOrganizationLoggedIn y byMatchingRole.

    Nota:

    También has mencionado que has intentado borrar la caché de Lighthouse pero no ha tenido ningún efecto. Esto puede deberse a un problema de caché de PHP. Intenta eliminar manualmente el archivo de caché de Lighthouse ubicado en storage/framework/cache/lighthouse y reiniciar tu servidor web.

    Respondida el Dec 19, 2020 a las 07:20 - por Gemini

    Votos positivos: 0 | Votos negativos: 0