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 查询联接生成的内部联接太多_Elixir_Inner Join_Ecto - Fatal编程技术网

Elixir 查询联接生成的内部联接太多

Elixir 查询联接生成的内部联接太多,elixir,inner-join,ecto,Elixir,Inner Join,Ecto,不确定为什么EXTO返回不正确的结果。 我可能把事情搞砸了 这是我的异位查询 from u in User, join: c in assoc(u, :companies), join: r in assoc(c, :roles), join: a in assoc(r, :assets), where: u.id == ^2 and a.id == ^1, group_by: [c.id, u.id, r

不确定为什么EXTO返回不正确的结果。 我可能把事情搞砸了

这是我的异位查询

from u in User, 
        join: c in assoc(u, :companies), 
        join: r in assoc(c, :roles), 
        join: a in assoc(r, :assets), 
        where: u.id == ^2 and a.id == ^1, 
        group_by: [c.id, u.id, r.id], 
        select: {u.email, u.id, r.name, c.name}
它产生:

    SELECT u0."email", u0."id", r2."name", c1."name" 
FROM "users" AS u0 
INNER JOIN "access_lists" AS a4 ON a4."user_id" = u0."id" 
INNER JOIN "companies" AS c1 ON a4."company_id" = c1."id" 
INNER JOIN "access_lists" AS a5 ON a5."company_id" = c1."id" 
INNER JOIN "roles" AS r2 ON a5."role_id" = r2."id" 
INNER JOIN "access_lists" AS a6 ON a6."role_id" = r2."id" 
INNER JOIN "assets" AS a3 ON a6."asset_id" = a3."id"
 WHERE ((u0."id" = $1) AND (a3."id" = $2)) 
GROUP BY c1."id", u0."id", r2."id" [2, 1]
此查询的结果不正确

这是正确的查询:

SELECT u0.email, u0.id, r2.name, c1.name, a6.asset_name , a6.id as asset_id
FROM users AS u0 
INNER JOIN access_lists AS a4 ON a4.user_id = u0.id 
INNER JOIN assets AS a6 ON a4.asset_id = a6.id 
INNER JOIN companies AS c1 ON a4.company_id = c1.id 
INNER JOIN roles AS r2 ON a4.role_id = r2.id 
WHERE ((u0.id = 2) AND (a6.id = 1)) 
Group By u0.id, r2.id, c1.id, a6.id
以下是模式:

访问列表:

  schema "access_lists" do
        belongs_to :user, Db.User
        belongs_to :role, Db.Role
        belongs_to :asset, Db.Asset
        belongs_to :project, Db.Project
        belongs_to :company, Db.Company

        timestamps()
    end
用户:

资产:

many_to_many :users, Db.User, join_through: Db.AccessList
many_to_many :companies, Db.Company, join_through: Db.AccessList 
many_to_many :roles, Db.Role, join_through: Db.AccessList 
many_to_many :projects, Db.Project, join_through: Db.AccessList 
公司:

    many_to_many :users, Db.User, join_through: Db.AccessList
    many_to_many :assets, Db.Asset, join_through: Db.AccessList 
    many_to_many :roles, Db.Role, join_through: Db.AccessList 
    many_to_many :projects, Db.Project, join_through: Db.AccessList 
角色:

这是一张图表: 我用过

from u in User, 
        join: acl in AccessList, on: acl.user_id == u.id,
        join: c in Company, on: acl.company_id == c.id, 
        join: r in Role, on: acl.role_id == r.id, 
        join: a in Asset, on: acl.asset_id == a.id, 
        where: u.id == ^2 and a.id == ^1, 
        group_by: [c.id, u.id, r.id], 
        select: {u.email, u.id, r.name, c.name}
这是有效的,我得到了正确的结果,但我不知道为什么

为什么我必须定义每个连接和


为什么我不能使用
join assoc
来代替而不查看模式,这很难说,但我可以猜测一下。由于
AccessList
用户
与公司、角色和资产之间的联接表,因此Ecto不知道如何在后续联接中重用先前的
AccessList
查询

试着像这样显式地映射它:

from u in User, 
  join: acl in assoc(u, :access_lists),
  join: c in assoc(acl, :companies),
  join: r in assoc(acl, :roles),
  join: a in assoc(acl, :assets),
  where: u.id == ^2 and a.id == ^1, 
  group_by: [c.id, u.id, r.id], 
  select: {u.email, u.id, r.name, c.name}

您是否介意尝试显式加入
access\u list
以帮助Ecto?这些关联是如何声明的?@MikeBuhot所有这些关联都是多对多的。@MikeBuhot正如您在我的回答中所看到的,这些关联工作得很好。我不明白为什么
assoc
不起作用,连接的显式路径也起作用。@mudasobwa感谢您对assoc(acl,:companys)中的
join:c以及类似的
角色和
资产
对您有效的提示?@Dogbert不,没有。请参见我的问题
来自
查询。结果不正确。当我显式地解释连接时,它就起作用了。@Dogbert我已经添加了模式这是我得到的
在模式数据库上找不到关联
access_list`
from u in User, 
        join: acl in AccessList, on: acl.user_id == u.id,
        join: c in Company, on: acl.company_id == c.id, 
        join: r in Role, on: acl.role_id == r.id, 
        join: a in Asset, on: acl.asset_id == a.id, 
        where: u.id == ^2 and a.id == ^1, 
        group_by: [c.id, u.id, r.id], 
        select: {u.email, u.id, r.name, c.name}
from u in User, 
  join: acl in assoc(u, :access_lists),
  join: c in assoc(acl, :companies),
  join: r in assoc(acl, :roles),
  join: a in assoc(acl, :assets),
  where: u.id == ^2 and a.id == ^1, 
  group_by: [c.id, u.id, r.id], 
  select: {u.email, u.id, r.name, c.name}