Как вызвать динамическую область Eloquent (с 1 аргументом) из схемы GraphQL в проекте Laravel?

У меня есть проект Laravel с некоторыми моделями, отношениями и динамическими областями в моделях для выполнения некоторых запросов по отношениям модели. Я хочу запросить эти модели с помощью конечной точки GraphQL с помощью пакета Lighthouse. Есть ли способ вызвать эти динамические области из схемы GraphQL?

Я пробовал директиву @where(clause: "...") безуспешно.

Это область действия кода моей модели:

class Solicitud extends Model {

    ...
    public function movimientos()
    {
        return $this->hasMany('App\Movimiento', 'id', 'id_solicitud_movimiento');
    }

    public function scopeConEstado($query, $id_estado)
    {
        $query->whereHas('movimientos', function($q) use ($id_estado) {
            $q->where('id_solicitud_estado', '=', $id_estado);
        })->get();
    }
}

Когда я запускаю запрос GraphQL, я получаю сообщение об ошибке SQL:

SQLSTATE[22P02]: Invalid text representation: 7 ERROR:  la sintaxis de entrada no es válida para integer: «id_estado» (SQL: select * from \"solicitud\" where exists (select * from \"solicitud_movimientos\" where \"solicitud\".\"id_solicitud_movimiento\" = \"solicitud_movimientos\".\"id\" and \"id_solicitud_estado\" = id_estado))

Однако, если я изменю $id_estado на простую 1 (например) в коде, я получу ожидаемые результаты для любого проекта, в котором есть элементы с id_solicitud_estado = 1, без ошибок.

Когда я запускаю с помощью tinker запрос, вызывающий область, он работает.

Solicitud::conEstado(1)->get();

Что я делаю неправильно? Что происходит с директивой @where(clause:) от Lighthouse? Может быть, следует использовать другую директиву?

Спасибо.

Что именно вы хотите запросить с помощью graphql? movimientos связь с conEstado областью действия Solicitud экземпляра?

Uroš Anđelić 31.05.2019 20:54

да. У Solicitud есть отношение «один ко многим», называемое movimientos, и я определил область conEstado для запроса этих movimientos с тем же id_solicitud_estado, который я передаю в качестве аргумента области.

jairochapela 01.06.2019 10:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
1 025
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, вы должны удалить ->get() из scopeConEstado. Области должны добавлять пункты к $query, а не разрешать его. Что касается вашего вопроса, я не думаю, что вы можете легко добавить динамическую область в определение схемы. Что вы можете сделать, так это добавить директиву @поле к соответствующему полю, а затем вы можете разрешить это поле, как хотите.

Большое спасибо за ваш ответ. Я удалил ->get() из области видимости. Наконец, я решил использовать директиву @строитель, потому что хочу фильтровать по значению, переданному в качестве аргумента.

jairochapela 05.06.2019 12:51

Другие вопросы по теме