Elixir / Phoenix查询包含数量

时间:2016-06-12 07:40:51

标签: elixir psql phoenix-framework elixir-framework

我的数据库中有以下表格:

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)如何使数量字段(来自订单项目表)也包含在查询计数中?例如,如果在订单商品中数量为2,则count()将仅计数为1,因此如何使count()不仅由id计数,还包括数量(来自订单商品表) ,数量领域)?

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

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

但它返回参数错误,所以我相信,我只是用item.name调用它是错误的。一般来说,我希望有一个表格,列出食物名称和相应的数量(来自order_item表,包括数量字段)。

由于

1 个答案:

答案 0 :(得分:2)

当你在Food 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。&#34; name&#34;,count(o0。&#34; id&#34;),sum(o0。&#34; quantity&#34;)FROM&#34; order_items&#34 ; AS o0 INNER JOIN&#34; food&#34; AS f1 ON o0。&#34; food_id&#34; = f1。&#34; id&#34; GROUP BY f1。&#34; name&#34; ORDER BY计数(o0。&#34; id&#34;)

对于第二部分,Repo.all会返回您查询的select部分中的所有内容列表,在您的情况下,这是一个元组,而不是地图,但您尝试访问它就像一张地图。

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

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

对于我上面写的返回Map的查询,您可以轻松访问这些字段:

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