2016-06-12 6 views
0

Ich habe folgende Tabellen in meiner db:Elixir/Phoenix Abfrage inkl Menge

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 

Auftragspositionen hält die food_id sowie Menge. Jetzt versuche ich eine Abfrage zu erstellen, die zeigt, wie viel jedes Lebensmittel bestellt wurde. Dies ist, was ich bisher:

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)) 

Grundsätzlich habe ich zwei Fragen: 1) Wie kann ich Mengenfeld (von Auftragsposition Tabelle) machen auch in der Abfrage zählen aufgenommen werden? Wenn zum Beispiel die Menge 2 ist, zählt count() nur als 1, also wie kann ich den count() nicht nur nach id zählen, sondern auch die Menge (aus der Bestellpositionstabelle) , Mengenfeld)?

Darüber hinaus bin ich nicht sicher, wie Sie die Abfrage aus dem HTML aufrufen. Ich habe versucht,

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

Aber es gibt Argument Fehler, so dass ich glaube, ich bin es nur mit item.name die falsche Art und Weise aufrufen. Im Allgemeinen möchte ich eine Tabelle haben, die Nahrungsmittelnamen und die jeweilige Quantität auflistet (von order_item Tabelle, einschließlich Quantitätsfeld).

Dank

Antwort

2

Wie Sie eine group_by auf der name Food zu machen, ich bin zu raten Sie die Summe der Menge wünschen. Hier ist, wie ich es tun würde:

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)) 

Dies erzeugt die folgende Abfrage:.

SELECT f1 "name", count (o0 "id".) Summe (o0 "Quantität".) FROM "order_items" AS o0 INNER JOIN "Nahrungsmittel", wie F1 auf o0. "food_id" = f1. "id" GROUP BY f1. "name" ORDER BY count (o0. "id")

Für die zweiter Teil, Repo.all gibt eine Liste von allem, was Sie in der select Teil Ihrer Abfrage haben, die in Ihrem Fall ein Tupel war, und nicht eine Karte, aber Sie haben versucht, darauf wie eine Karte zuzugreifen.

Für Ihre ursprüngliche Abfrage, dies funktionieren wird:

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

Für die Abfrage, die ich oben geschrieben habe, die eine Karte zurückgibt, können Sie die Felder leicht zugänglich machen können:

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

Danke dogbert! Also, ich hätte einfach die Summe() für die Berechnung der Menge anstelle der Zählung verwenden sollen. Was die Tupel anbelangt, sehe ich, was ich falsch gemacht habe, ich werde Ihrem Vorschlag folgen und stattdessen eine Karte verwenden! – Ilya

+0

Ja, "count" würde die Anzahl der Aufträge zurückgeben, während "sum (quantity)" alle Mengen dieser Aufträge aufaddiert. – Dogbert

Verwandte Themen