我创建了一个小例子,其中模型如下所示
Student --- hasMany ---> Homework --- hasMany -----> Page
现在,当我加载以下内容时(注意:查看者是学生),学生有一个查询,一个用于作业,但多个用于页面。查询的页数与页数一样多。我如何优化它,以便所有页面只有一个查询。
最好的情况是立即加载整个事情,但我很乐意提供有关如何优化此事的任何指示。
{
viewer(id: 3) {
name
homeworks{
subject
pages{
content
}
}
}
}
我用来测试此代码的代码可在https://gist.github.com/hardfire/3ff69d3a602bf3c30dcbbca71d67d605
获得答案 0 :(得分:0)
从我过去几天学到的东西来看,用书架来做这件事是不可能的,而且graphql的哲学不允许这样的事情。
最好的选择是使用dataloader。将它与书架一起使用应该是直截了当的。我将不得不使用它来找出使用它的最佳模式。
页面的示例加载器类似于
var PageLoader = new Dataloader(keys => {
return Page
.where('homework_id', 'IN', keys)
.fetchAll()
.then(collection => {
var groupedItems = _.groupBy(collection.models, (el) => el.get('homework_id'))
return _.map(keys, key => groupedItems[key])
})
})
然后可以在HomeworkType
中使用它...
pages: {
type: new GraphQLList(PageType),
description: 'pages in the homework',
resolve: (homework) => PageLoader.load(homework.id)
},
...