2017-08-16 61 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