Elixir/Phoenix 查询含数量

Elixir/Phoenix query incl quantity

我的数据库中有以下 table:

schema "foods" do
field :name, :string
has_many :order_items, MyApp.OrderItem
end

schema "order_items" do
field :quantity, :integer, default: 1
field :price, :integer
belongs_to :food, MyApp.Food

订单商品保持 food_id 以及数量。现在我正在尝试创建一个查询,以显示每种食品的订购量。这是我目前所拥有的:

fooditems = Repo.all(from p in OrderItem, join: f in Food, on: p.food_id == f.id,
                     group_by: f.name, select: {f.name, count(p.id)}, order_by: count(p.id))

基本上,我有两个问题:1) 如何使数量字段(来自订单项 table)也包含在查询计数中?例如,如果订单商品的数量为 2,则 count() 只会计数为 1,那么如何让 count() 不仅按 ID 计数,还包括数量(来自订单商品 table, 数量字段)?

此外,我不确定如何从 html 调用查询。我试过了

            <%= for item <- @fooditems do %>
                <tr>
                <td><%= item.name %></td>
                </tr>
            <% end %>

但它 returns 参数错误,所以我相信,我只是用 item.name 称呼它的方式不对。一般来说,我想要一个 table 来列出食物名称和相应的数量(来自 order_item table,包括数量字段)。

谢谢

当您在食品 name 上执行 group_by 时,我猜您想要数量的总和。以下是我的做法:

Repo.all(from p in OrderItem,
           join: f in Food,
           on: p.food_id == f.id,
           group_by: f.name,
           select: %{name: f.name, count: count(p.id), quantity: sum(p.quantity)},
           order_by: count(p.id))

这会生成以下查询:

SELECT f1."name", count (o0."id"), sum (o0."quantity") FROM "order_items" AS o0 INNER JOIN "foods" AS f1 ON o0."food_id" = f1."id" GROUP BY f1."name" ORDER BY count (o0."id")

对于第二部分,Repo.all returns 查询的 select 部分中的任何内容的列表,在您的情况下是一个元组,而不是地图,但您尝试像访问地图一样访问它。

对于您的原始查询,这将有效:

<%= for {food_name, count} <- @fooditems do %>

对于我上面写的查询,其中returns一个Map,你可以轻松访问字段:

<%= for item <- @fooditems do %>
  <tr>
    <td><%= item.name %></td>
    <td><%= item.count %></td>
    <td><%= item.quantity %></td>
  </tr>
<% end %>