如何在Laravel项目中的GraphQL模式中调用Eloquent动态范围(带有1个参数)?

时间:2019-05-31 16:27:13

标签: php laravel eloquent graphql lighthouse

我有一个Laravel项目,其中包含一些模型,关系和进入模型的动态范围,以沿模型关系执行一些查询。我想使用Lighthouse包使用GraphQL端点查询这些模型。有什么方法可以从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的项目的任何项目,我都会得到预期的结果,

当我使用修补程序启动调用范围的查询时,它可以工作。

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

我在做什么错? Lighthouse的@where(clause :)指令会发生什么情况?也许应该使用另一个指令?

谢谢。

1 个答案:

答案 0 :(得分:0)

首先,您应该从->get()中删除scopeConEstado。范围应将子句添加到$query,而不是解析它。至于您的问题,我认为您不能轻松地在架构定义中添加动态范围。您可以做的是在有问题的字段中添加一个@field指令,然后可以根据需要解析该字段。