elixir - 将 LEFT OUTER JOIN 查询转换为 Ecto

标签 elixir phoenix-framework ecto

我不知道如何将 SQL 语句翻译成 Ecto。

Phoenix 设置

mix phx.gen.html Location Country countries name
mix phx.gen.html Location FederalState federal_states name
mix phx.gen.html Calendar Day days date_value:date
mix phx.gen.html Calendar Period periods name 
                                         starts_on:date 
                                         ends_on:date
                                         country_id:references:countries
                                         federal_state_id:references:federal_states
mix pix.gen.html Calendar Slot slots day_id:references:days 
                                     period_id:references:periods

SQL语句
SELECT days.date_value, periods.name FROM days 
LEFT OUTER JOIN slots ON (days.id = slots.day_id) 
LEFT OUTER JOIN periods ON (slots.period_id = periods.id and 
(periods.country_id = 1 OR 
periods.federal_state_id = 5)) 
WHERE days.date_value >= '2017-01-01' AND 
days.date_value <='2017-12-31' 
ORDER BY days.date_value;

是否可以用 Ecto 函数替换此 SQL 语句?

最佳答案

默认情况下,left_join 执行 LEFT OUTER JOIN。如果对表使用相同的别名,则查询的其余部分很容易翻译。如果您将 starts_onends_on 定义为具有适当值的 Date 结构,这应该可以工作:

query = from(
             days in Day,
             left_join: slots in MehrSchulferien.Calendar.Slot,
             on: days.id == slots.day_id,
             left_join: periods in MehrSchulferien.Calendar.Period,
             on: slots.period_id == periods.id and
                 (periods.country_id == ^federal_state.country_id or
                  periods.federal_state_id == ^federal_state.id),
             where: days.date_value >= ^starts_on and
                    days.date_value <= ^ends_on,
             order_by: days.date_value
            )

关于elixir - 将 LEFT OUTER JOIN 查询转换为 Ecto,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46463522/

相关文章:

datetime - 在Ecto.DateTime和DateTime之间转换

elixir - 在 Phoenix/Plug/Cowboy 中重写 URL?

phoenix-framework - 如何检查结构是否持久化?

elixir - 我可以在 Ecto 中使用其中一个关联的聚合计数来查询模型吗?

docker - 运行 Elixir 容器 Bootstrap 时出现错误加载模块 pooler_app,我该如何解决?

elixir - 在 Elixir 中获取当前日期和/或时间

erlang - 如何实现一个函数来通知一个节点另一个节点是否退出

bootstrap-modal - 如何将 Bootstrap 模态组件与 Phoenix 集成?

mysql - Ecto 不允许使用片段参数进行 mysql 全文搜索

json - 从 Elixir ecto 关联创建 json