首页 > 解决方案 > 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
  }
}

标签: schemagraphql

解决方案


将字段添加到仅在特定上下文中填充的类型通常是不好的做法。您可以将 a 添加ratingBook类型中,但是在获取已借阅的书籍列表时,您只能使用值解析它 - 如果您正在为其他字段获取书籍或书籍数组,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
}

这使得查询返回的结果数据更加嵌套,但它也使数据更容易建模和推理。然后,这些字段的解析器也可以相对简单 -checkouts字段 forUser并且Book只是Checkouts通过UserBookid 获取。上的userandbook字段Checkout只查询Useror Bookby id。


推荐阅读