2017-08-16 83 views
3

我有一个拥有many_to_many关联的凤凰应用程序。在这个应用程序:如何在Ecto/Phoenix中的many_to_many关系中访问关联表中的字段?

我有一个用户表:

schema "users" do 
    field :username, :string 
    many_to_many :organizations, Organization, join_through: "memberships" 
end 

和组织表:

schema "organization" do 
    field :org_name, :string 
    many_to_many :members, Users, join_through: "memberships" 
end 

最后,我有成员表:

schema "memberships" do 
    field :role, :string 
    belongs_to :organization, Organization 
    belongs_to :user, User 
end 

我的问题:有没有什么好办法从会员对象中检索role字段,并且a在单个SQL查询中关联对象?我知道我可以在两个单独的查询中查询关联和关联对象,但我想知道是否有更干净的方法来执行此操作。

回答

1

会这样的帮助吗? 我没有带测试,但它显示了一个预加载查询的想法:

首先一个has_many成员字段添加到您的模型,以便您可以预加载用户的会员资格:

schema "users" do 
    field :username, :string 
    many_to_many :organizations, Organization, join_through: "memberships" 
    has_many: :memberships, Membership # <- add this line 
end 

然后尝试请求如下:

import Ecto.Query 

organization_id = ... 

members_query = 
    from u in User, 
    join: m in Membership, 
    on: m.user_id == u.id and m.organization_id == ^organization_id, 
    preload: [memberships: m] 

query = 
    from o in Organization, 
    where: o.id == ^organization_id, 
    preload: [members: ^members_query] 

query |> YourApp.Repo.all