Laravel : 2 개의 쿼리를 1로 결합

Aug 16 2020

나는 다음과 같은 관계가 있습니다.

'주문'-> manyToMany-> '제품'

'주문'-> manyToMany-> 'collis'-> manyToMany 제품

이미지의 다른 테이블은 신경 쓰지 마십시오.

주문한 모든 제품을 검색하고 각 제품의 총 수량을 얻고 싶습니다. 결과는 다음과 같습니다.

[{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"}

나는 콜리를 고려하지 않고 모든 제품을 얻습니다.

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

콜리에 있던 모든 제품은

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

두 쿼리 모두 위에서 언급 한 것과 동일한 테이블 구조 (배열)를 반환합니다. 하지만 이제 첫 번째 테이블의 total_product_quantity를 두 번째 테이블에 추가하고 병합 된 테이블을 반환합니다. 어떻게 할 수 있습니까?

내 SQL에 대한 지식과 심지어 laravel 쿼리 작성기에 대한 지식이 매우 낮으므로 쿼리를 작성하는 더 좋은 방법이 있다면 (더 웅변 적일까요?) 제발 알려주세요!

답변

Abdulmajeed Aug 17 2020 at 07:33

관계를 사용하여 데이터를 얻을 수 있습니다.이 관계는 hasManyThrough입니다.

이 시도 :

모델 주문

public function products(){
        return $this->hasManyThrough(Colli::class, Product::class)->withPivot('quantity');

    }