Elixir 多种条件下的外接连接

Elixir 多种条件下的外接连接,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,假设我有三个模型: user: has_one wallet wallet: belongs_to user transactions: belongs_to wallet 我正在尝试获取给定用户的所有事务。我可以使用的SQL如下所示: def user_transactions_query(id) do from tr in Transaction, join: wallet in assoc(tr, :wallet), join: user in assoc(walle

假设我有三个模型:

user: has_one wallet
wallet: belongs_to user
transactions: belongs_to wallet
我正在尝试获取给定用户的所有事务。我可以使用的SQL如下所示:

def user_transactions_query(id) do
  from tr in Transaction,
    join: wallet in assoc(tr, :wallet),
    join: user in assoc(wallet, :user),
    where: user.id == ^id
end
选择
* 
从…起
作为t的交易
参加
钱包如w
在w.user_id=1上
和w.id=t.wallet\u id
现在,在Ecto中,以下功能可以正常工作,但不会复制上面的查询:

wallet = assoc(user, :wallet)
q = from t in Transaction,
join: w in ^wallet,
where: t.wallet_id == w.id,
order_by: [desc: t.id],
select: t
我找不到任何用于创建带有
案例的关联的文档。我试过:

join: w in (^wallet and assoc(t, :wallet)),
但这会导致编译错误。目标是仅在assoc上编写此查询,而不使用手动
id
连接,以使关系抽象保留在模型中

编辑

按照@daniel的建议并查看文档,我通过在
上的
中提供额外的条件,用多个连接条件构建了查询:

id = user.id
q = from t in Transaction,
join: w in assoc(t, :wallet),
on: w.user_id == ^id,
order_by: [desc: t.id],
select: t

被剪断的会产生以下结果:

def user_transactions_query(id) do
  from tr in Transaction,
    join: wallet in assoc(tr, :wallet),
    join: user in assoc(wallet, :user),
    where: user.id == ^id
end
选择t0.“id”
从“交易”到t0
内部连接“钱包”为w1
ON(w1.“id”=t0.“钱包id”)
和(w1.“用户id”=1美元)

首先,您应该弄清楚您的模式是什么,我假设:

schema "transactions" do
  belongs_to :wallet, Wallet
  timestamps()
end

schema "wallet" do
  belongs_to :user, User
  has_many :transactions, Transaction
  timestamps()
end

schema "user" do
  has_one :wallet, Wallet
  timestamps()
end
您的查询应如下所示:

def user_transactions_query(id) do
  from tr in Transaction,
    join: wallet in assoc(tr, :wallet),
    join: user in assoc(wallet, :user),
    where: user.id == ^id
end

假设我有可用的
user
struct,是否可以用
assoc
更改
where:user.id==^id
此行?当然,此语法与创建join相同虽然这确实解决了问题,但它生成的查询比我发布的原始查询更复杂,并且不会在联接中转换为
<代码>从“交易”中选择t0。“id”作为t0内部联接“钱包”作为w1上的w1。“id”=t0。“钱包id”内部联接“用户”作为u2上的u2。“id”=w1。“用户id”其中(u2。“id”=1)
您尝试的是自定义联接类型。ASSOC允许以牺牲灵活性为代价抽象连接。这种类型的联接不能用assoc完成,也没有多大意义。您可能需要阅读的部分包括:关联、查询api、动态查询。