लारवेल: 1 में 2 प्रश्नों को मिलाएं
मेरे निम्नलिखित रिश्ते हैं:
'ऑर्डर' -> manyToMany -> 'उत्पाद'
तथा
'ऑर्डर' -> manyToMany -> 'Collis' -> कईTMMany उत्पाद
छवि में अन्य तालिकाओं को ध्यान में न रखें।
मैं उन सभी उत्पादों को पुनः प्राप्त करना चाहता हूं जो ऑर्डर किए गए हैं और प्रत्येक उत्पाद की कुल मात्रा प्राप्त करते हैं। परिणाम कुछ इस तरह दिखना चाहिए:
[{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');
जैसा कि ऊपर बताया गया है, दोनों प्रश्न एक ही तालिका संरचना (सरणी) को लौटाते हैं। लेकिन अब मैं पहली तालिका से दूसरी तालिका में कुल_प्रकार_कुंडली जोड़ना चाहता हूं, और विलय की गई तालिका लौटाता हूं। मैं यह कैसे कर सकता हूँ?
Sql और यहां तक कि लार्वा क्वेरी बिल्डर का मेरा ज्ञान काफी कम है, इसलिए यदि प्रश्न लिखने के लिए बेहतर तरीके हैं (शायद अधिक स्पष्ट!), तो कृपया मुझे बताएं!
जवाब
आप डेटा प्राप्त करने के लिए संबंधों का उपयोग कर सकते हैं, यह संबंध hasManyThrough है
इसे इस्तेमाल करे :
मॉडल क्रम में
public function products(){
return $this->hasManyThrough(Colli::class, Product::class)->withPivot('quantity');
}