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

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

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

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

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, без ошибок.

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

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

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

Спасибо.

1 Ответ

0 голосов
/ 02 июня 2019

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

...