GraphQL 如何做一个 JOIN 请求而不是许多顺序请求?

Posted

技术标签:

【中文标题】GraphQL 如何做一个 JOIN 请求而不是许多顺序请求?【英文标题】:GraphQL how to do a JOIN request instead of many sequential request? 【发布时间】:2018-11-05 23:22:47 【问题描述】:

我有两种 GraphQL 类型:

type Author 
  id: String!
  name: String!


type Book 
  id: String!
  author: Author!
  name: String!

在我的数据库中,它是通过 books 表中的外键实现的:

表作者(伪代码)

`id` INTEGER UNSIGNED
`name` STRING

表书(伪代码)

`id` INTEGER UNSIGNED
`author_id` INTEGER UNSIGNED REFERENCE `authors.id`
`name` STRING

所以当我解决一个像这样的 GraphQL 查询时:

query allTheBooks 
  id
  name
  author 
    id
    name
  

我只想做一个SELECT SQL 查询,比如:

SELECT books.id, books.name, authors.id, authors.name
FROM books
LEFT JOIN authors ON authors.id = books.author_id

而不是当前的:

SELECT books.id, books.name, books.author_id
FROM books

SELECT authors.id, authors.name
FROM authors
WHERE author.id = [one the the books.author_id of the first SELECT]

SELECT authors.id, authors.name
FROM authors
WHERE author.id = [one the the books.author_id of the first SELECT]

[...]

有没有办法知道在 GraphQL 解析器中查询了哪些“子字段”?

提前感谢您的回答!

【问题讨论】:

我会在作者中添加一个书籍字段,这样您也可以解析作者的所有书籍。就像一个 2 侧的方式。 是的,但这与问题无关,所以我尽可能简单。 【参考方案1】:

我刚刚发现,在解析器提供的第四个参数中,有一个查询字段数组:info.fieldNodes[0].selectionSet.selections

我没有找到任何关于此的文档,我想知道什么代表 fieldNodes 数组...(并且不喜欢在不知道的情况下以这种方式访问​​第一个元素...)。

selections 对象包含一个这样的数组:

[
  
    kind: 'Field',
    alias: undefined,
    name:  kind: 'Name', value: 'id', loc: [Object] ,
    arguments: [],
    directives: [],
    selectionSet: undefined,
    loc:  start: 36, end: 38 
  ,
  
    [...]
  ,
  ...
]

这里,value: 'id' 匹配相关作者的查询字段的名称。

如果我更深一层,selectionSet: undefined 会变成一个对象,并且模式会递归地重复自己......

【讨论】:

以上是关于GraphQL 如何做一个 JOIN 请求而不是许多顺序请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何将GraphQL查询作为字符串而不是对象导入

为啥即使我们尝试获取数据而不是更新/提交新数据,GraphQL 也会查询 POST 请求?

如何在 GraphQL 中包含突变请求元数据?

Spring JPA/Hibernate Repository findAll 在 Kotlin 中默认执行 N+1 个请求而不是 JOIN

Gatsby:在 GraphQL 查询中允许不存在的字段

如何在 graphQL 中编写 JOIN 或从多种类型中获取结果 - AWS App sync iOS