【问题标题】:Ecto Join based on custom key field name基于自定义键字段名称的 Ecto Join
【发布时间】:2019-07-17 02:28:57
【问题描述】:

我正在尝试让join 使用 Ecto。 Ecto 似乎默认将“id”作为连接条件的关键字段。尝试使用架构中的外键设置将其更改为 list_id 和 user_id,但它似乎不起作用。我错过了什么?

query =
          from(i in SgListItems,
            join: l in assoc(i, :sg_lists),
            join: u in assoc(i, :sg_users),
           select: [l.list_id, i.item_id]
          )

被翻译成

SELECT s1."list_id", s0."item_id" FROM "sg_list_items" AS s0 INNER JOIN "sg_lists" AS s1 ON **s1."id"** = s0."list_id" INNER JOIN "sg_users" AS s2 ON **s2."id"** = s0."author_id" ) []

例如 sg_lists 的架构如下:

 @primary_key {:list_id, :binary_id, autogenerate: true}
  schema "sg_lists" do
    field(:list_title, :string, null: false)
    field(:list_description, :map, null: false)

    has_many(:sg_list_items, MyApp.SgListItems, foreign_key: :list_id)
    timestamps()
  end

以下 sg_list_items 的架构。

 @primary_key {:item_id, :binary_id, autogenerate: true}
  schema "sg_list_items" do
    belongs_to(:sg_lists, MyApp.SgLists, foreign_key: :list_id, type: :binary_id)
    field(:item_hierarchy, :map, null: false)
    field(:item_title, :string, null: false)
    field(:item_description, :map, null: false)
    belongs_to(:sg_users, MyApp.SgUsers, foreign_key: :author_id, type: :binary_id)
    timestamps()
  end

【问题讨论】:

    标签: elixir ecto


    【解决方案1】:

    您可以使用join:on 选项明确设置要加入的字段。

    尝试类似:

    query =
      from(i in SgListItems,
        join: l in assoc(i, :sg_lists), on: [id: i.list_id],
        join: u in assoc(i, :sg_users), on: [id: i.user_id],
        select: [l.list_id, i.item_id]
      )
    

    这一行:[id: i.list_id]id 指的是:sg_listsid,下一行是指:sg_users 的。

    如果您想使用:sg_list:sg_users 中的不同字段,您应该使用这些字段而不是:id,并将i.list_id 替换为SgListItems 中的正确字段

    这应该可行。

    您甚至可以向:on 选项添加多个条件,例如:

    on: [id: i.user_id, other_field: i.other_field] 也可以。但我认为你需要的就像上面的sn-p一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 2020-06-20
      • 2014-06-13
      • 2017-03-15
      • 2011-02-01
      • 2016-02-05
      相关资源
      最近更新 更多