win*_*yer 4 elixir ecto phoenix-framework
我无法弄清楚如何将SQL语句转换为Ecto.
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
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
是否可以用Ecto函数替换此SQL语句?
一个left_join做了LEFT OUTER JOIN默认.如果对表使用相同的别名,则可以直接翻译查询的其余部分.如果你有一个starts_on并ends_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
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2467 次 |
| 最近记录: |