代码之家  ›  专栏  ›  技术社区  ›  Jason O.

基于自定义键字段名的外接联接

  •  0
  • Jason O.  · 技术社区  · 6 年前

    我想得到 join 使用异位素工作。exto似乎默认为'id'作为连接条件的键字段。尝试使用架构中的外键设置将其更改为列出用户ID和用户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_的模式如下:

     @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_项的架构。

     @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
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   sbacarob    6 年前

    通过使用 :on 选择权 join .

    尝试以下方法:

    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_lists 身份证件 ,在下一行中,它指的是 :sg_users 是一个。

    如果要使用不同的字段 :sg_list SGUI用户 ,你应该把它们 :id ,并替换 i.list_id 对于正确的字段 SgListItems

    这应该管用。

    您甚至可以将多个条件添加到 关于 选项,类似于:

    on: [id: i.user_id, other_field: i.other_field] 也会起作用的。但我认为你需要的只是上面的片段。