使用 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)
},
...