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

How to call an Eloquent dynamic scope (with 1 argument) from a GraphQL schema in a Laravel project?

我有一个 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 项目的项目,我都会得到预期的结果,其中没有错误。

当我使用 tinker 启动调用范围的查询时,它起作用了。

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

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

谢谢。

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