使用子查询预先加载Ecto并使用主查询中的连接

时间:2017-11-28 15:54:44

标签: elixir ecto

我使用Ecto从数据库中请求数据,并且我已使用以下代码预加载 price_discount 过滤的。< / p>

Item
|> join(:inner, [i], c in Cat, c.food_category_id == i.id)
|> where([i, c], is_nil(c.price_discount))
|> preload([i, c],
  [
    cats: c,
    cats: :houses
  ])

这很好用,但现在我想通过id订购Houses,所以我正在跳这项工作:

Item
|> join(:inner, [i], c in Cat, c.food_category_id == i.id)
|> where([i, c], is_nil(c.price_discount))
|> preload([i, c],
  [
    cats: c,
    cats: [
      houses: from(h in Houses, order_by: h.id)
    ]
  ])

但它没有,这就是错误:

from(h in Houses, order_by: h.id()) is not a valid preload expression. preload expects an atom, a list of atoms or a keyword list with more preloads as values. Use ^ on the outermost preload to interpolate a value

唯一有效的帖子是使用以下其中一项:

  • 在没有订单的情况下使用cats: c
  • 使用houses: from(h in Houses, order_by: h.id)

以下作品,使用^:     项目     |&GT; join(:inner,[i],c in Cat,c.food_category_id == i.id)     |&GT; where([i,c],is_nil(c.price_discount))     |&GT;预载([i,c],       ^ [         猫: [           房屋:从(h in Houses,order_by:h.id)         ]       ])

这是Ecto中的错误吗?

1 个答案:

答案 0 :(得分:3)

如果要为预加载及其嵌套预加载提供自定义查询,可以使用元组语法,其中第一个元素是主查询,第二个元素是预加载列表,就像你想要的那样处于最高水平。

您可以通过以下方式实现您的目标:

|> preload([i, c], [cats: {c, houses: ^from(h in Houses, order_by: h.id)}])