Laravel: รวม 2 แบบสอบถามเป็น 1

Aug 16 2020

ฉันมีความสัมพันธ์ดังต่อไปนี้:

'คำสั่งซื้อ' -> manyToMany -> 'สินค้า'

และ

'orders' -> 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"}

ฉันได้รับผลิตภัณฑ์ทั้งหมดโดยไม่ต้องคำนึงถึงของ 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');

และผลิตภัณฑ์ทั้งหมดที่มีอยู่ใน colli's ด้วย

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

    }