Laravel/Lighthouse GraphQL API按非主键列搜索问题求助
问题:GraphQL按非主键列id_position筛选数据无效,返回全部Employee行
我正在基于现有API实现GraphQL功能,希望创建按非主键列id_position而非id的搜索功能。
我的Schema定义:
type Query @guard { subordinate( positionId: ID ): [Employee!]! @all } type Position @key(fields: "id") { id: ID name: String } "Account of a person who utilizes this application." type Employee @key(fields: "id") { id: ID name: String id_position: Int }
执行的查询语句:
query EmployeeSubordinate($id: ID) { subordinate(positionId: $id) { name } }
变量:
{ "id" : 93 }
执行后返回了所有Employee行数据,而非id_position=93的结果,该如何解决?
解决方案
问题核心是@all指令的作用就是返回所有数据,它不会自动关联你传入的positionId参数和id_position字段的筛选逻辑。针对不同的GraphQL实现方式,有两种常见解决路径:
1. 使用框架自带的筛选指令(如Hasura等低代码GraphQL服务)
直接替换@all为支持筛选的指令,明确指定匹配条件:
type Query @guard { subordinate( positionId: ID ): [Employee!]! @filter(where: { id_position: { _eq: $positionId } }) }
通过@filter指令的where条件,把传入的positionId参数和Employee的id_position字段做相等匹配,就能只返回符合条件的数据。
2. 自定义Resolver处理筛选逻辑
如果是自己编写Resolver代码,需要在Resolver里手动实现筛选逻辑:
// 示例Node.js环境Resolver代码 const resolvers = { Query: { subordinate: async (_, { positionId }, { dataSources }) => { // 调用数据源方法时传入筛选条件 return dataSources.employeeAPI.getEmployeesByPosition(positionId); }, }, };
在对应的数据源方法中,添加id_position的筛选条件,比如SQL查询:
SELECT * FROM employees WHERE id_position = ?
额外注意点
确保参数类型匹配:positionId定义的是ID类型,而id_position是Int类型,传递变量时要保证类型一致(当前变量是数字93没问题,若传字符串"93"需要先转成数字再匹配)。
内容的提问来源于stack exchange,提问作者Laggio Vanotto
相关产品推荐
相关产品推荐

