2

一个社区有很多家。每个家都归一个人所有。

假设我有这个 graphql 查询:

{
    neighborhoods {
        homes {
            owner {
                name
            }
        }
    }
}

我可以预加载所有者,这将使数据请求成为单个 SQL 查询。美好的。

但是如果我不在graphql查询中请求所有者,数据仍然会被预加载。

如果我不预加载,数据要么在每个查询中获取,要么根本不获取,因为我没有在解析器中加载 belongs_to 关联。

我不确定这是否是一个已解决的问题,或者只是一个在使用 graphql 时必须接受的痛点。

顺便使用 Absinthe、DataLoader 和 Elixir。

4

2 回答 2

1

大多数 GraphQL 实现,包括 Absinthe,都公开了某种“信息”参数,其中包含特定于正在解析的字段和正在执行的请求的信息。您可以解析此对象以确定实际请求了哪些字段并适当地构建您的 SQL 查询。

有关更深入的讨论,请参阅此问题。

于 2019-12-04T02:49:35.653 回答
0

为了补充 Daniel Rarden 所说的,您必须使用info.definition解决嵌套包含。

在我的应用程序中,我定义了一组可能的值,例如:

defp relationships do
  [
    {:person, [tasks: [:items]]]}
    ...
   ]
end

然后我有一个逻辑迭代info.definition并使用这个函数来预加载关联。

您将使用DataLoader延迟加载资源。通常用于获取第三方请求或执行复杂的数据库查询。

于 2020-08-14T03:33:35.990 回答