Laravel: Kombiniere 2 Abfragen zu 1
Ich habe folgende Beziehungen:
'Bestellungen' -> manyToMany -> 'Produkte'
und
'Bestellungen' -> manyToMany -> 'collis' -> manyToMany Produkte
Beachten Sie nicht die anderen Tabellen im Bild.
Ich möchte alle bestellten Produkte abrufen und die Gesamtmenge jedes Produkts erhalten. Das Ergebnis sollte ungefähr so aussehen:
[{id: 6, name: "steak", category_name: "beef", total_product_quantity: "2.00"}
{id: 7, name: "bacon", category_name: "pork", total_product_quantity: "1.00"}
{id: 9, name: "chicken filet", category_name: "chicken", total_product_quantity: "1.00"}
Ich bekomme alle Produkte ohne Berücksichtigung der Collis
$allProducts = DB::query()
->select(['p.id', 'p.name', 'c.name as category_name', DB::raw('sum(op.quantity) as total_product_quantity')])
->from('products as p')
->join('order_product as op', 'p.id', '=', 'op.product_id')
->join('orders as o', 'op.order_id', '=', 'o.id')
->join('categories as c', 'p.category_id', '=', 'c.id')
->groupBy('p.id');
und alle Produkte, die in Zusammenarbeit mit vorhanden waren
$allProductsInAllCollis = DB::query()
->select(['p.id', 'p.name', 'c.name as category_name', DB::raw('sum(co.quantity * colp.quantity) as total_product_quantity')])
->from('products as p')
->join('colli_product as colp', 'p.id', '=', 'colp.product_id')
->join('collis as col', 'colp.colli_id', '=', 'col.id')
->join('colli_order as co', 'col.id', '=', 'co.colli_id')
->join('orders as o', 'co.order_id', '=', 'o.id')
->join('categories as c', 'col.category_id', '=', 'c.id')
->groupBy('p.id', 'p.name', 'category_name');
Beide Abfragen geben dieselbe Tabellenstruktur (Array) wie oben erwähnt zurück. Aber jetzt möchte ich die total_product_quantity von der ersten Tabelle zur zweiten hinzufügen und die zusammengeführte Tabelle zurückgeben. Wie kann ich das machen?
Meine Kenntnisse über SQL und sogar den Builder für Laravel-Abfragen sind recht gering. Wenn es also bessere Möglichkeiten gibt, die Abfragen zu schreiben (vielleicht beredter?), Lassen Sie es mich bitte wissen!
Antworten
Sie können Beziehungen verwenden, um Daten abzurufen. Diese Beziehung lautet hasManyThrough
Versuche dies :
in Modellbestellung
public function products(){
return $this->hasManyThrough(Colli::class, Product::class)->withPivot('quantity');
}