在 Ecto 中,在带有连接的查询中使用查询函数
In Ecto, using a query function in a query with a join
我有 2 个模型 Player
和 Event
。玩家 has_many 事件。我有一个 ecto 查询,它获得了如下最佳得分手:
from(p in Player,
join: s in assoc(p, :events),
group_by: [p.id],
select: %{total_goals: count(s.id), player: p},
where: s.type == "goal_scored",
where: p.team_id == ^team_id,
order_by: [desc: count(s.id)],
limit: 10
)
|> Repo.all()
这很好用,但在我的 Event
模型中,我有一个方便的函数来只查询 goal_scored
:
类型的事件
def goals(query) do
from(e in query, where: e.type == "goal_scored")
end
有什么方法可以在包含连接的查询中使用此查询函数?
Ecto.Query.dynamic/2
是你的朋友。直接用 Event
中的完整查询是不可能的,但你可以这样拆分它:
def goal_scored_condition do
dynamic([e], e.type == "goal_scored")
end
def goals(query) do
conditions = goal_scored_condition()
from(e in query, where: ^conditions)
end
并在 Player
conditions = Event.goal_scored_condition()
from(p in Player,
...
where: ^conditions,
...
在某些情况下,Ecto.Query.subquery/2
也可能有帮助。
我有 2 个模型 Player
和 Event
。玩家 has_many 事件。我有一个 ecto 查询,它获得了如下最佳得分手:
from(p in Player,
join: s in assoc(p, :events),
group_by: [p.id],
select: %{total_goals: count(s.id), player: p},
where: s.type == "goal_scored",
where: p.team_id == ^team_id,
order_by: [desc: count(s.id)],
limit: 10
)
|> Repo.all()
这很好用,但在我的 Event
模型中,我有一个方便的函数来只查询 goal_scored
:
def goals(query) do
from(e in query, where: e.type == "goal_scored")
end
有什么方法可以在包含连接的查询中使用此查询函数?
Ecto.Query.dynamic/2
是你的朋友。直接用 Event
中的完整查询是不可能的,但你可以这样拆分它:
def goal_scored_condition do
dynamic([e], e.type == "goal_scored")
end
def goals(query) do
conditions = goal_scored_condition()
from(e in query, where: ^conditions)
end
并在 Player
conditions = Event.goal_scored_condition()
from(p in Player,
...
where: ^conditions,
...
在某些情况下,Ecto.Query.subquery/2
也可能有帮助。