Graphql 中的可选变量

Optional variable in Graphql

我有一个这样的 graphql 查询:

query SomeQuery($id: Int) {
  some_query(where: {id: {_eq: $id}}) {
    id
    name
  }
}

当我 运行 时,它期望一个 id 作为变量。我怎样才能使该变量可选?当没有给出 id

时,它应该显示所有结果

此变量 $id: Int 已声明为可选变量,因此您需要将其强制包含!运算符 $id: Int!。服务器中需要存在逻辑以检查传递的 id 是否为 null/empty 然后 return 一切。

我不知道如何将一个变量声明为可选的,但也无法像您在此处使用 Hasura 演示的那样忽略表达式的其余部分。

相反,您应该定义您的查询,使您收到的变量是实际的布尔表达式,并有条件地从调用者那里传入变量。尝试像这样编写您的查询:

query getItems($where: items_bool_exp) {
  items(where: $where) {
    name
  }
}

这使得过滤器成为可选的,因此如果您将 null 传递给 $where,您将取回所有内容。否则,您可以将实际过滤条件作为变量传递并返回您期望的结果

{
  "where": {
    "id": {
      "_eq": 42
    }
  }
}

您只需更新实际发出查询的客户端,以使用关于是否应发送 ID 谓词的正确条件逻辑。

由于这是用 reactjs 标记的,这里是 JS 的解决方案。

这实际上是可行的,但在创建查询时需要进行一些字符串插值。

const generateSomeQuery = (id?: string) => gql`
  query SomeQuery(
    ${id ? '$id: uuid' : ''}
  ) {
    some_query(
      where: {
        ${id ? 'id: {_eq: $id}' : ''}
      }
    ) {
      id
      name
    }
  }
`