【问题标题】:How do I access fields from association table in many_to_many relationships in Ecto/Phoenix?如何在 Ecto/Phoenix 的 many_to_many 关系中访问关联表中的字段?
【发布时间】:2018-01-25 05:58:24
【问题描述】:

我有一个具有 many_to_many 关联的 Phoenix 应用程序。在这个应用程序中:

我有一个用户表:

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 字段,以及在单个 SQL 查询中的关联对象?我知道我可以在两个单独的查询中查询关联和关联对象,但我想知道是否有更简洁的方法。

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多