Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 体外循环嵌套预压_Elixir_Phoenix Framework_Ecto - Fatal编程技术网

Elixir 体外循环嵌套预压

Elixir 体外循环嵌套预压,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我试图在EXTO中编写一个嵌套查询,从post表中预加载注释,然后在一个单独的查询中为每个注释预加载用户。这看起来像: post = Repo.preload(Repo.get(Post, id), [:comments]) comments = Repo.preload(post.comments, [:user]) 问题是,当我知道有一种方法可以在一个查询中加载我需要的所有数据时,它会在数据库上运行3个不同的查询 这与join:assoc()有关吗?我不认为通过一个查询就可以做到这一点,据

我试图在EXTO中编写一个嵌套查询,从post表中预加载
注释
,然后在一个单独的查询中为每个注释预加载
用户
。这看起来像:

post = Repo.preload(Repo.get(Post, id), [:comments])
comments = Repo.preload(post.comments, [:user])
问题是,当我知道有一种方法可以在一个查询中加载我需要的所有数据时,它会在数据库上运行3个不同的查询


这与
join:assoc()
有关吗?

我不认为通过一个查询就可以做到这一点,据我所知,你必须将评论和用户加入到帖子中,如果有,比方说,50条评论,你会有50行,其中有相同的用户,我不知道这对你是否合适。不过,我认为您可以通过两个查询来实现这一点,大致如下:

comments_query = 
  Comment
  |> join(:inner, [c], u in assoc(c, :user))
  |> preload([c, u], user: u)
post = Repo.preload(Repo.get(Post, id), comments: comments_query)
我还没有测试过代码,但我相信它应该会起作用,或者至少你会有大致的想法。

(我在这里迟交了一个答案,仅供参考。)你可以尝试以下方法:

Repo.preload(Repo.get(Post, id), [{:comments, :user}]).comments
或同等地,以下任一项:

Repo.preload(Repo.get(Post, id), [comments: :user]).comments
Repo.preload(Repo.get(Post, id), comments: :user).comments

对构造嵌套预加载的语法有很好的解释。也很有用。

您希望这段代码只运行一个查询吗?或者,您是否正在寻找只需要一个查询的另一种方法?在前一种情况下,这似乎是不可能的-您对执行查询的函数进行了三次单独的调用。我正在寻找另一种方法来完成与代码相同的操作,但只在一个查询中。所以它最终会像
post=Repo.one(新查询)