具有多个嵌套解析器并将字段映射到参数的 GraphQL 查询

Posted

技术标签:

【中文标题】具有多个嵌套解析器并将字段映射到参数的 GraphQL 查询【英文标题】:GraphQL query with multiple nested resolvers and mapping fields to arguments 【发布时间】:2021-05-19 23:42:07 【问题描述】:

从 GraphQL 客户端的角度来看,如何使用多个嵌套解析器执行查询,其中父字段作为参数传递给子解析器?

这是一个最小的例子:

GraphQL 架构:

type Author 
  id: ID!
  name: String!


type Book 
  id: ID!
  title: String!
  releaseDate: String!



type Query 
  // Returns a list of Authors ordered by name, 'first' indicates how many entries to return
  getAllAuthors(first: Int!): [Author]!
  // Returns a list of Books ordered by releaseDate, 'first' indicates how many entries to return
  getBooksByAuthorId(first: Int! authorId: ID!): [Book]!

是否可以编写查询来获取所有作者及其最近出版的书籍?线条周围的东西:

query GetAuthorsWithLastBook($first: Int!) 
  getAllAuthors(first: $first) 
    authorId: id
    name
    lastBook: getBooksByAuthor(1, authorId) 
      title
    
  

在上面的示例中,我尝试将 getAllAuthors.id 别名为 authorId 并将别名作为参数传递给 getBooksByAuthor(...),但这没有用。

问题的关键在于我事先不知道authorIds。我可以先获取作者并构建一个查询来获取他们的最后一本书,但这会导致多个查询,这是我想避免的。

更新

此处提供了 Java Kickstarter 示例:https://www.graphql-java-kickstart.com/tools/schema-definition/

【问题讨论】:

【参考方案1】:

是的,在graphql定义上,需要在Author中添加lastBook

type Author 
  id: ID!
  name: String!
  lastBook: [Book]

接下来你需要为lastBook编写解析器

const resolvers = 
  Query: 
    Author 
      lastBook: (parent, args) 
        const userId = parent.id;
        return getBooksByAuthor(userId, 1);
      ,
    
  
;

【讨论】:

是的。效果很好,谢谢。我正在使用 Java Kickstarter 实现,经过大量挖掘后,我能够在他们的文档中找到一些参考资料。 graphql-java-kickstart.com/tools/schema-definition

以上是关于具有多个嵌套解析器并将字段映射到参数的 GraphQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

多个字段解析器使用不同的查询参数解析相同的 REST API

Mybatis resultMap 嵌套集合

AppSync GraphQL 模拟解析器映射未生成唯一项目

如何设置映射输入的嵌套 JSON 数组对象的状态

如何将具有嵌套对象的复杂 json 文件映射到 java 对象?

解析嵌套的 JSON 并将其保存到 SQLite 中,然后检索它