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 %>
我的数据库中有以下 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 %>