我有两种GraphQL类型:
type Author {
id: String!
name: String!
}
type Book {
id: String!
author: Author!
name: String!
}
在我的数据库中,它是由books
表中的一个外键实现的:
authors
的表(伪代码)
`id` INTEGER UNSIGNED
`name` STRING
books
的表(伪代码)
`id` INTEGER UNSIGNED
`author_id` INTEGER UNSIGNED REFERENCE `authors.id`
`name` STRING
因此,当我解析像这样的GraphQL查询时:
query allTheBooks {
id
name
author {
id
}
}
除了将获得图书列表的查询之外,我不想执行另一个SQL查询,因为我在books.author_id
字段中已经有了数据。
因此,我替换了以下代码(js):
Book: {
async author(book, args, context, info) {
// this code trigger a database SELECT query that fetch all the fields of the author row associated with the book
return book.author().get();
}
}
出自:
Book: {
async author(book, args, context, info) {
return {
id: book.author_id,
}
}
}
而且它工作得很好!
我只有一个SQL查询,其中我有1+N (N是第一个查询返回的行数)。
但是如何才能在不按字段发送查询的情况下返回其他字段?
我认为有可能通过为所有字段返回一个唯一的承诺,这将与author
行的所有内容一起解析,但我想知道是否有更干净的方法……
提前感谢您的答复!
发布于 2018-05-27 08:57:00
现在,我找到了一种或多或少干净的方法来做这件事:
Book: {
async author(book, args, context, info) {
let authorPromise = null;
async function getAuthor() {
if (authorPromise === null) {
authorPromise = book.author().get();
}
return authorPromise;
}
return new Proxy({}, {
async get({}, name) {
if (name === "id") {
return book.author_id;
}
if (name in authorFields) {
const author = await getFile();
return author[name];
}
},
});
}
}
它确保我每行只执行一次查询,但给我留下了另一个关于表连接的问题,但我将其发布为here :-)
发布于 2018-05-30 09:33:55
您不必进行1+N查询。您可以将N个查询批处理为1。只需查看https://github.com/facebook/dataloader即可。
https://stackoverflow.com/questions/50547791
复制相似问题