使用数据加载器批量加载苦艾酒中的字段



我的Absinin graphql模式中有一个对象,看起来像这样:

object :match do
field(:id, non_null(:id))
field(:opponent, non_null(:string))
@desc "The number of votes that have been cast so far."
field(:vote_count, non_null(:integer), resolve: &MatchResolver.get_vote_count/2)
# etc...
end

我使用的是vote_count的解析器,它使用父match执行ecto查询。但是,如果查询匹配项列表,则会遇到n+1查询问题。目前看起来是这样的:

def get_vote_count(_root, %{source: %Match{} = match}) do
count = match |> Ecto.assoc(:votes) |> Repo.aggregate(:count, :id)
{:ok, count}
end

我已经在使用数据加载器批量加载子实体,但在使用Absinin提供的Absinthe.Resolution.Helpers.dataloader函数时,我似乎无法获得自定义的run_batch函数。

使用dataloader/ecto实现自定义批量查询的推荐方法是什么?有人能举一个例子,包括模式定义部分吗?

假设您在某个时候已经做了这样的事情:

Dataloader.add_source(Match, Match.data())

那么我很确定你想使用arity/3的解析器函数,如下所示:

def get_vote_count(_, %{source: %Match{} = match}, %{context: %{loader: loader}}) do
loader
|> Dataloader.load_many(Match, Match.Vote, [match_id: match.id])
|> Dataload.run()
|> Dataload.get_many(Match, Match.Vote, [match_id: match.id])
|> Enum.count
end

我刚写完一个苦艾酒/凤凰城的后端,所以它在我的脑海中很新鲜,但实际上我根本没有测试过。它可能需要一些调整。希望它能让你朝着正确的方向前进。

最新更新