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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:21:01