【问题标题】:Optional variable in GraphqlGraphql 中的可选变量
【发布时间】:2021-07-22 09:33:07
【问题描述】:

我有一个这样的 graphql 查询:

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

当我运行它时,它期望 id 作为变量。如何使该变量可选?当没有给出id 时,它应该显示所有结果

【问题讨论】:

    标签: sql reactjs select graphql hasura


    【解决方案1】:

    这个变量$id: Int 已经被声明为可选的,你需要包含!运营商$id: Int!。逻辑需要存在于服务器中以检查传递的 id 是否为空/空,然后返回所有内容。

    【讨论】:

    • 它抛出这个错误:"message": "expected a 32-bit integer for type \"Int\", but found null"
    • 这仅在客户端检查可选/强制,检查架构是如何在服务器上定义的。
    • 这仅在客户端检查可选/强制,检查架构是如何在服务器上定义的。
    【解决方案2】:

    我不知道将变量声明为可选,但也让它忽略表达式的其余部分,就像您在这里使用 Hasura 演示的那样。

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

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

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

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

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

    【讨论】:

    • 嗨,Jesse,items_bool_exp 来自哪里?我认为它可能是一个可以忽略的空值,但在我的 api 上我只是得到未知类型。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-18
      • 2021-04-08
      • 2017-12-03
      • 2021-10-13
      • 2015-12-15
      • 2019-05-17
      • 2023-03-12
      • 2020-10-22
      • 1970-01-01
      相关资源
      最近更新 更多