Laravel: combina 2 consultas en 1
Tengo las siguientes relaciones:
'pedidos' -> manyToMany -> 'productos'
y
'orders' -> manyToMany -> 'collis' -> manyToMany productos

No te preocupes por las otras tablas de la imagen.
Quiero recuperar todos los productos pedidos y obtener la cantidad total de cada producto. El resultado debería ser similar a:
[{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"}
Consigo todos los productos sin tener en cuenta los colli's con
$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');
y todos los productos que estaban presentes en colli's con
$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');
Ambas consultas devuelven la misma estructura de tabla (matriz) que se mencionó anteriormente. Pero ahora quiero agregar total_product_quantity de la primera tabla a la segunda y devolver la tabla combinada. ¿Cómo puedo hacer esto?
Mi conocimiento de sql e incluso del generador de consultas de laravel es bastante bajo, así que si hay mejores formas de escribir las consultas (¿más elocuentes tal vez?), ¡Hágamelo saber por favor!
Respuestas
puede usar relaciones para obtener datos, esta relación es hasManyThrough
prueba esto :
en modelo Orden
public function products(){
return $this->hasManyThrough(Colli::class, Product::class)->withPivot('quantity');
}