【问题标题】:How to query for dynamic amount of aliases?如何查询别名的动态数量?
【发布时间】:2023-03-10 23:10:02
【问题描述】:

假设我有一个这样的 GraphQL Schema:

Schema {
  user($id: ID) {
    id: ID
    name: String
  }
}

我知道如何通过他的 ID 查询一个用户,我可以使用别名来查询多个用户,如下所示:

GetSomeMore {
  john: user(id: "123") {
    name
  }
  mary: user(id: "321") {
    name
  }
}

但是,假设我只有一个用户 ID 列表,并且想查询每个用户 ID 的名称。我该如何编写这样的查询?

我能想到的方法是以太动态地生成一个带有user1user2 等别名的查询,或者在服务器上实现一个users(ids: [ID]) 边缘。但我觉得应该有更好的解决方案。有吗?

(PS:我的代码示例可能有语法错误,我更多地将其编写为伪代码,以表达我的观点。)

【问题讨论】:

    标签: javascript node.js graphql graphql-js


    【解决方案1】:

    我会同意你的最后一个提议:

    Schema {
      users($ids: [ID]) {
        id: ID
        name: String
      }
    }
    

    使用类似的解析器:

    const users = async (root, { ids }) => await knex('users').whereIn('id', ids)
    

    注意:我使用 + + 来创建我的架构、我的类型和我的解析器。

    【讨论】:

    • 这是否意味着 GraphQL 中没有内置功能可以做到这一点?
    • 我不这么认为。 GraqhQL 没有什么神奇之处:当您开始执行复杂查询时,您必须编写大量代码来生成结果。 :)
    • 我也更喜欢这种方法。它以精简和简单的方式告诉哪些用户要获取。使用filter*_inANDOR 会迫使客户端从数据库的角度进行思考——恕我直言,这不是一个好的 GraphQL API 设计。
    • 它根本不强迫客户在数据库中思考。结合这些过滤器并处理逻辑服务器端几乎符合 GraphQL 精神 imo。另一种方法是获取所有用户并在客户端过滤它们......
    【解决方案2】:

    您可以将该功能作为架构的一部分来实现,例如在 users 查询中使用 id_in: [String] 参数。

    在 Graphcool,我们使用 filter 参数来公开这样的功能。例如,您的查询可以这样完成:

    query {
      allUsers(filter: {id_in: ["123", "321"]}) {
        id
        name
      }
    }
    

    结果

    {
      "data": {
        "allUsers": [
          {
            "id": "123",
            "name": "John"
          },
          {
            "id": "321",
            "name": "Mary"
          }
        ]
      }
    }
    

    要了解更多关于 filter 参数的信息,请查看 the documentation

    【讨论】:

    • 好的,这看起来很实用,而且我看到它是之前“一个用户”边缘的超集。然而,获得一个用户的优势似乎是可行的(男人用例看起来就是这样)。您认为应该删除“一个用户”的优势并继续使用您的解决方案,还是两者都保留?
    • 是的,这很有意义!我们还有User 查询返回一个User。它接受 id 参数,或您在控制台 UI 中声明为 uniqueUser 模型上的任何字段。例如,如果您有用户的唯一名称,您可以这样查询:query { User(name: "John") { id } }
    • 嗨@mar​​ktani!您是否在开源中实现了filter? :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多