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
    ,因此您根本不需要为评论预加载文章,只需使用您传递的评论即可