gpt4 book ai didi

elixir - 使用带有子查询的 Ecto 进行预加载并使用主查询中的联接

转载 作者:行者123 更新时间:2023-12-02 03:10:11 32 4
gpt4 key购买 nike

我使用 Ecto 从数据库请求数据,并使用以下代码预加载按 price_discount 过滤的 cats

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 订购房屋,所以我希望这项工作:

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)

使用 ^ 可以实现以下效果:

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: [
houses: from(h in Houses, order_by: h.id)
]
])

这是 Ecto 中的错误吗?

最佳答案

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

您想要的可以通过以下方式实现:

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

关于elixir - 使用带有子查询的 Ecto 进行预加载并使用主查询中的联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47535714/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com