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
相关产品推荐
相关产品推荐

