Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 基于自定义密钥字段名的EXTO联接_Elixir_Ecto - Fatal编程技术网

Elixir 基于自定义密钥字段名的EXTO联接

Elixir 基于自定义密钥字段名的EXTO联接,elixir,ecto,Elixir,Ecto,我正在尝试使用EXTO让加入工作。EXTO似乎默认为“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,

我正在尝试使用EXTO让
加入
工作。EXTO似乎默认为“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_列表的模式如下所示:

 @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_列表_项的架构如下

 @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

通过使用
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\u id]
id
指的是
:sg\u列出的
id
,在下一行,它指的是
:sg\u用户的

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

这应该行得通

您甚至可以向
: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]
  )
on:[id:i.user\u id,other\u字段:i.other\u字段]
也可以。但我认为你需要的就像上面的片段一样