2017-07-03 10 views
0

Ich habe eine Tabelle transactions, die eine paymentable_id und paymentable_type Spalte für polymorphe Beziehungen hat. Ich habe ein Modell Plan, das für Zahlungspläne verwendet wird. Immer wenn eine Transaktion für diesen Plan ausgeführt wird, werden die Transaktionen mit diesem Plan verknüpft, wobei die polymorphe Beziehung verwendet wird.Laravel Raw und Eloquent Abfragen

Jetzt möchte ich alle Plans aus der Datenbank abrufen, einschließlich eines Feldes namens total_amount. Das Feld total_amount sollte die Summe aller transactions.amount für diesen Plan enthalten.

Bisher und mit Hilfe von einer anderen Frage, die ich fragte, kam ich mit dem Follow-up:

$ Pläne = App \ Models \-Plan :: alle ('*', DB :: RAW ("(SELECT SUM (Betrag) FROM Transaktionen WHERE paymentable_id = plans.id UND paymentable_type = 'App \\ Models \ Plan') als total_amount "));

Was ganz gut funktioniert. Aber ich finde, dass das einfach falsch ist:

WHERE paymentable_id = plans.id AND paymentable_type = 'App\\\\Models\\\\Plan' 

Auch die Notwendigkeit, die paymentable_id zu spezifizieren und paymentable_type scheint mir falsch. Ich muss dies auch für viele andere Fragen tun, da die polymorphe Beziehung bis zu 5 verschiedene Modelle enthalten kann.

Frage 1. Ist die obige eine richtige Abfrage zu verwenden und wenn ja, gibt es vielleicht auch einen "besseren Weg", um diese Abfrage zu erstellen?

Frage 2. Die nachfolgende Abfrage funktioniert auch, aber ich verstehe vielleicht nicht diesen Teil:

->join('transactions', 'plans.id', '=', 'transactions.paymentable_id') 

Jedes Mal, wenn ich die ->where('transactions.paymentable_id', '=', 'plans.id') sind, ist es wie erwartet funktioniert. Aber ohne diesen Teil ignoriert es grundsätzlich die paymentable_id.

Alle Zeiger sind sehr geschätzt.

Antwort

1

ich weiß nicht, Sie Datenbank

$plans = DB::table('plans')->join('transactions', 'plans.id', '=', 'transactions.paymentable_id') 
         ->where('transactions.paymentable_type', '=', 'you_plan_type') 
         ->select('plans.*','transactions.*') 
         ->selectRaw('sum(transactions.amount) as total_amount') 
         ->get(); 
+0

Vielen Dank, dass mir geholfen, lernen ein paar neue Sachen gibt, cool scheint zu funktionieren: – Hardist