Elixir 预加载外部关联的两侧
我如何预加载一个Elixir 预加载外部关联的两侧,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我如何预加载一个有多个且属于与EXTO关联的的两侧 例如,在一篇文章有许多评论且评论属于一篇文章的情况下: defmodule MyApp.Article do schema "articles" do has_many :comments, MyApp.Comments timestamps end end defmodule MyApp.Comment do schema "comments" do belongs_to :article, MyApp
有多个且属于与EXTO关联的的两侧
例如,在一篇文章有许多
评论且评论属于一篇文章的情况下:
defmodule MyApp.Article do
schema "articles" do
has_many :comments, MyApp.Comments
timestamps
end
end
defmodule MyApp.Comment do
schema "comments" do
belongs_to :article, MyApp.Article
timestamps
end
end
我如何为一篇文章创建一个查询,在不执行3个单独的查询的情况下,预加载其评论
关联和每个评论上的post
关联?第三个可以再次找到每个帖子的帖子似乎是不必要的
# Does 2 queries to return the Article with `comments` preloaded but not
# the `post` on each Comment
Repo.get!(Article, 123) |> Repo.preload(:comments)
# Does 3 queries to return the Article with `comments` preloaded and
# preloads `post` for each Comment
Repo.get!(Article, 123) |> Repo.preload([:comments, comments: :post])
你的问题实际上是关于两件事
如果您有一对多关系,则无需“预加载双方”,因为依赖表中的所有记录都引用它们所属的一条记录。引入这种循环有什么意义
您希望消除示例中的查询数量。现在至少有两个查询,因为首先通过发出Repo.get向数据库发出请求
,然后使用Repo.preload
创建第二个
在EXTO中有两种形式的preload
——当您在EXTO文档的搜索框中键入“preload”时,您可以看到它们。结果是:
异位查询
预加载/3
外部回购
预加载/2
第一个用于查询内部
您使用了第二个,下面是文档中关于它的说明:
“这与exto.Query.preload/3类似,只是它允许您在从数据库获取模型后预加载它们。”
如果您查看这个函数的示例,您会清楚地看到,您需要已经获取的模型(或多个模型)来“填充”更多的值
看起来这不是你想要的-你需要摆脱第一个Repo.get
。因此,您需要在查询中使用预加载的形式
应该是这样的:
id=123
query=来自文章中的,其中:a.id=^id,预加载:[:注释]
查询|>Repo.all
请注意,在查询中引用已绑定的变量时,需要使用^
符号
希望这有帮助。你的问题实际上是关于两件事
如果您有一对多关系,则无需“预加载双方”,因为依赖表中的所有记录都引用它们所属的一条记录。引入这种循环有什么意义
您希望消除示例中的查询数量。现在至少有两个查询,因为首先通过发出Repo.get向数据库发出请求
,然后使用Repo.preload
创建第二个
在EXTO中有两种形式的preload
——当您在EXTO文档的搜索框中键入“preload”时,您可以看到它们。结果是:
异位查询
预加载/3
外部回购
预加载/2
第一个用于查询内部
您使用了第二个,下面是文档中关于它的说明:
“这与exto.Query.preload/3类似,只是它允许您在从数据库获取模型后预加载它们。”
如果您查看这个函数的示例,您会清楚地看到,您需要已经获取的模型(或多个模型)来“填充”更多的值
看起来这不是你想要的-你需要摆脱第一个Repo.get
。因此,您需要在查询中使用预加载的形式
应该是这样的:
id=123
query=来自文章中的,其中:a.id=^id,预加载:[:注释]
查询|>Repo.all
请注意,在查询中引用已绑定的变量时,需要使用^
符号
希望这有帮助。我不确定我是否正确理解了你的问题,但你为什么不能保持原样呢?进行3次查询并不比进行1次查询慢多少,可能甚至比使用左连接或类似方式连接表还要快。我进行第3次查询的问题是,我已经进行了一次查询以获取这些记录。-查询#1查找id为123的文章
123-查询#2查找id为post\u的评论
123-查询#3再次查找id为123的文章
123以在每个评论上设置post
。能否显示post的架构?它只显示问题中的文章和评论。对不起,当我说“Post”时,我指的是“Article”,我不知道该怎么做,当你呈现文章时,你可以将文章及其评论传递给那里,如下所示:render MyApp.ArticleView,“Article.html”,Article:@Article,评论:@article.comments
,因此您根本不需要为评论预加载文章,您可以使用您传递的评论。我不确定我是否正确理解您的问题,但为什么您不能保持原样?进行3次查询并不比进行1次查询慢多少,可能甚至比使用左连接或类似方式连接表还要快。我进行第3次查询的问题是,我已经进行了一次查询以获取这些记录。-查询#1查找id为123的文章
123-查询#2查找id为post\u的评论
123-查询#3再次查找id为123的文章
123以在每个评论上设置post
。能否显示post的架构?它只显示问题中的文章和评论。对不起,当我说“Post”时,我指的是“Article”,我不知道该怎么做,当你呈现文章时,你可以将文章及其评论传递给那里,如下所示:render MyApp.ArticleView,“Article.html”,Article:@Article,评论:@article.comments
,因此您根本不需要为评论预加载文章,只需使用您传递的评论即可