首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ecto表连接

Ecto表连接
EN

Stack Overflow用户
提问于 2016-09-13 15:19:17
回答 1查看 1.5K关注 0票数 1

Ecto文档展示了如何基于模式中定义的关联连接两个表(A<-B)。我想通过添加另一个表来扩展它(B <- C)

https://hexdocs.pm/ecto/Ecto.html#assoc/2

但是我得到了这个错误。如何在此查询中反映:comments属于:posts这一事实?

代码语言:javascript
复制
Repo.all from u in App.User,                                                                                                                                                                
 join: p in assoc(u, :posts),                                                                                                                                                                  
 join: c in assoc(p, :comments),                                                                                                                                                               
 preload: [posts: p],                                                                                                                                                                          
 preload: [comments: c]                                                                                                                                                                        

** (Ecto.QueryError) field `App.User.comments` in preload is not an association in query:                                                                                                         

from u in App.User,                                                                                                                                                                                 
  join: p in App.Post,                                                                                                                                                                              
  on: p.user_id == u.id,                                                                                                                                                                                
  join: c in App.Comment,                                                                                                                                                                          
  on: c.post_id == p.id,                                                                                                                                                                                
  select: u,                                                                                                                                                                                            
  preload: [posts: p, comments: c]                                                                                                                                                                  

    (elixir) lib/enum.ex:651: Enum."-each/2-lists^foreach/1-0-"/2                                                                                                                                       
    (elixir) lib/enum.ex:651: Enum.each/2                                                                                                                                                               
      (ecto) lib/ecto/repo/queryable.ex:119: Ecto.Repo.Queryable.execute/5                                                                                                                              
      (ecto) lib/ecto/repo/queryable.ex:40: Ecto.Repo.Queryable.all/4 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-13 16:03:21

您可以在树状结构中预加载关联,然后根据需要映射结果。

代码语言:javascript
复制
> subquery = App.Post |> preload(:comments)
#Ecto.Query<from p in App.Post, preload: [:comments]>

> query = App.User |> preload(posts: ^subquery)
#Ecto.Query<from u in App.User, 
preload: [posts: #Ecto.Query<from p in App.Post, preload: [:comments]>]>

> Repo.all(query)
[
  %App.User{...},
  %App.User{...},
  %App.User{
    ...,
    posts: [
      %App.Post{...},
      %App.Post{...},
      %App.Post{
        ...,
        comments: [
          %App.Comment{...},
          %App.Comment{...},
          %App.Comment{...}
        ]
      }
    ]
  }
]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39464263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档