在 Ecto 中,在带有连接的查询中使用查询函数

In Ecto, using a query function in a query with a join

我有 2 个模型 PlayerEvent。玩家 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 也可能有帮助。