Graphql:解决其他类型时如何定义类型以使用特定实例?

时间:2018-10-28 17:10:06

标签: schema graphql

我有一个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
  }
}

1 个答案:

答案 0 :(得分: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
}

这使查询返回的结果数据更加嵌套,但同时也使数据更易于建模和推理。这些字段的解析器也可以相对简单一些-checkoutsUser的{​​{1}}字段只获取Book或{{1 }} ID。 Checkouts上的UserBook字段仅通过ID查询userbook