Laravel: 2 sorguyu 1'de birleştirin

Aug 16 2020

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

Abdulmajeed Aug 17 2020 at 07:33

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

    }