You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Typed Document Node结合Vue3 Apollo如何定义Laravel Lighthouse动态复杂where查询

动态筛选场景下Laravel Lighthouse + GraphQL Typed Document Node 实现方案

核心思路是将整个where筛选条件作为GraphQL变量传入,不在查询字符串中写死任何字段、操作符,既适配Lighthouse的Complex Where插件规则,也能保留Typed Document Node的类型安全能力,具体步骤如下:

1. 定义通用查询结构

写GraphQL查询时将where参数声明为变量,不要硬编码筛选条件:

query GetPeople($where: PeopleWhereConditions) {
  people(where: $where) {
    name
    # 其余需要返回的业务字段
  }
}

其中PeopleWhereConditions是Lighthouse Complex Where插件为people查询自动生成的where入参类型,如果你不确定准确名称,可以直接从项目的GraphQL Schema中查阅对应字段的入参定义替换即可。

2. 生成带类型的查询文档

配合GraphQL Code Generator的Typed Document Node插件,自动生成上面查询对应的peopleDocument对象,生成的类型会自动关联Lighthouse定义的where条件类型,不会丢失类型校验能力。

3. 动态构造筛选变量

根据用户选择的筛选器、操作符、输入值,按Lighthouse要求的结构拼接where变量即可,支持单条件、多条件AND/OR嵌套等所有Complex Where支持的规则:

// 示例:单条件动态筛选
const dynamicWhere = {
  column: userSelectedColumn, // 用户选择的字段,如AGE、NAME等
  operator: userSelectedOperator, // 用户选择的操作符,如EQ、LIKE、GT等
  value: userInputValue // 用户输入的筛选值
}

// 示例:多条件组合筛选
const dynamicWhere = {
  AND: [
    { column: 'AGE', operator: 'GT', value: 18 },
    { column: 'NAME', operator: 'LIKE', value: '%王%' }
  ]
}

4. 发起查询

和原有调用逻辑完全兼容,直接将构造好的动态where作为变量传入useQuery即可:

useQuery(peopleDocument, {
  variables: {
    where: dynamicWhere
  }
})

额外优化提示:可以将GraphQL Schema中定义的字段枚举、操作符枚举通过Codegen导出到前端,用户选择筛选条件时用枚举限制可选范围,提前规避无效的字段/操作符传入后端。

内容的提问来源于stack exchange,提问作者Trekstler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:45:04