Laravel: 2 sorguyu 1'de birleştirin
Aşağıdaki ilişkilerim var:
'siparişler' -> manyToMany -> 'ürünler'
ve
'siparişler' -> manyToMany -> 'collis' -> manyToMany ürünleri
Resimdeki diğer tablolara aldırmayın.
Sipariş edilen tüm ürünleri almak ve her bir ürünün toplam miktarını almak istiyorum. Sonuç şunun gibi görünmelidir:
[{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"}
Colli'yi hesaba katmadan tüm ürünleri alıyorum
$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');
ve colli'lerde bulunan tüm ürünler
$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');
Her iki sorgu da yukarıda belirtildiği gibi aynı tablo yapısını (dizi) döndürür. Ama şimdi birinci tablodan ikinci tabloya total_product_quantity eklemek ve birleştirilmiş tabloyu döndürmek istiyorum. Bunu nasıl yapabilirim?
Sql ve hatta laravel sorgu oluşturucu hakkındaki bilgim oldukça düşük, bu yüzden sorguları yazmanın daha iyi yolları varsa (daha anlamlı olabilir mi?), Lütfen bana bildirin!
Yanıtlar
veri almak için ilişkileri kullanabilirsiniz, bu ilişki hasManyThrough
bunu dene :
model Siparişte
public function products(){
return $this->hasManyThrough(Colli::class, Product::class)->withPivot('quantity');
}