【问题标题】:Graphql: how to define a type to use specific instance when resolving another type?Graphql:如何在解析另一种类型时定义一个类型以使用特定实例?
【发布时间】:2018-10-30 08:08:15
【问题描述】:

我有一个类型 User 和一个类型 Book 定义如下:

type User {
  id: ID!
  borrowedBooks: [Book]
}

type Book {
  id: ID!
  name: String
  borrowedBy: [User]
}

现在我想存储用户对每本书的评分。我的问题是:我应该如何定义模式,以便我可以查询用户对每本借书的评分?我是否可以像下面这样查询评分,如果不能,处理这种情况的常用方法是什么。

getUser(id: "xxx"): {
  borrowedBooks: {
    id
    name
    rating # <------ get the rating value
  }
}

【问题讨论】:

  • 您的架构无法确定您如何从 GraphQL 位于前面的任何数据源获取数据,这就是您的解析器逻辑所做的。在最坏的情况下,模式可能会使从这些数据源中获取数据的效率低于其应有的效率。您是在特定数据源的上下文中询问,还是在某些特定的 GraphQL 实施(如 AWS AppSync)中询问?
  • 嗨@DanielRearden,谢谢你的回复。是的,我明白你的意思,根据使用的数据源,可能必须以不同的方式定义解析器甚至模式。我想我有两个问题。首先是如何为该用例定义模式(查询方法不必与我写的相同,只是想知道像您这样的其他开发人员如何处理)。第二个问题是如何实际旋转它。你说得对,我正在使用 AppSync。很高兴知道如何在 AppSync 中执行此操作,或者至少测试 AppSync 是否可以正确转换解析器。

标签: schema graphql


【解决方案1】:

将字段添加到仅在特定上下文中填充的类型通常是不好的做法。您可以rating 添加到Book 类型,但只有在获取已借书列表时才能使用值解析它——如果您正在获取一本书或其他领域的书籍数组,rating 字段可能不一定有意义。

您可能想要的是另一种类型(如果我们谈论的是底层数据库,还有另一个表)来将用户与他们借来的书联系起来。比如:

type User {
  id: ID!
  checkouts: [Checkout]
}

type Book {
  id: ID!
  name: String
  checkouts: [Checkout]
}

type Checkout {
  user: User
  book: Book
  rating: Int
  lastCheckoutDate: Date
  # other fields specific to the checkout itself
}

这使得查询返回的结果数据更加嵌套,但它也使数据更容易建模和推理。这些字段的解析器也可以相对简单——UserBookcheckouts 字段通过 UserBook id 获取所有 CheckoutsCheckout 上的 userbook 字段只需通过 id 查询 UserBook

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 2019-09-07
    • 2020-10-04
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多