Laravel: połącz 2 zapytania w 1
Mam następujące relacje:
„zamówienia” -> manyToMany -> „produkty”
i
„zamówienia” -> manyToMany -> „collis” -> produkty manyToMany

Nie przejmuj się innymi tabelami na obrazku.
Chcę pobrać wszystkie zamówione produkty i uzyskać łączną ilość każdego produktu. Wynik powinien wyglądać mniej więcej tak:
[{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"}
Dostaję wszystkie produkty bez uwzględnienia colli
$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');
i wszystkie produkty, które były obecne w colli z
$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');
Oba zapytania zwracają tę samą strukturę tabeli (tablicę), jak wspomniano powyżej. Ale teraz chcę dodać total_product_quantity z pierwszej tabeli do drugiej i zwrócić scaloną tabelę. Jak mogę to zrobić?
Moja znajomość sql, a nawet konstruktora zapytań laravel jest dość niska, więc jeśli są lepsze sposoby pisania zapytań (może bardziej elokwentne?), Daj mi znać, proszę!
Odpowiedzi
możesz użyć relacji, aby uzyskać dane, ta relacja to hasManyThrough
Spróbuj tego :
w modelu Order
public function products(){
return $this->hasManyThrough(Colli::class, Product::class)->withPivot('quantity');
}