使用 graphql-bookshelf 优化书架的使用
optimizing usage of bookshelf with graphql-bookshelf
我创建了一个小例子,模型如下所示
Student --- hasMany ---> Homework --- hasMany -----> Page
现在,当我加载以下内容时(注意:查看者是学生),学生有一个查询,家庭作业有一个查询,页面有多个查询。有多少页面就有多少查询。我怎样才能优化它,以便所有页面只有一个查询。
最好的情况是一次加载所有内容,但我很乐意提供有关如何优化它的任何指示。
{
viewer(id: 3) {
name
homeworks{
subject
pages{
content
}
}
}
}
我用来测试它的代码可在 https://gist.github.com/hardfire/3ff69d3a602bf3c30dcbbca71d67d605
获得
根据我过去几天的了解,仅用书架是不可能做到这一点的,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)
},
...
我创建了一个小例子,模型如下所示
Student --- hasMany ---> Homework --- hasMany -----> Page
现在,当我加载以下内容时(注意:查看者是学生),学生有一个查询,家庭作业有一个查询,页面有多个查询。有多少页面就有多少查询。我怎样才能优化它,以便所有页面只有一个查询。
最好的情况是一次加载所有内容,但我很乐意提供有关如何优化它的任何指示。
{
viewer(id: 3) {
name
homeworks{
subject
pages{
content
}
}
}
}
我用来测试它的代码可在 https://gist.github.com/hardfire/3ff69d3a602bf3c30dcbbca71d67d605
获得根据我过去几天的了解,仅用书架是不可能做到这一点的,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)
},
...