Laravel: объединить 2 запроса в 1
У меня следующие отношения:
'заказы' -> 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"}
Я получаю все продукты без учёта колли с
$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 довольно низки, поэтому, если есть более эффективные способы написания запросов (возможно, более красноречивые?), Дайте мне знать, пожалуйста!
Ответы
вы можете использовать отношения для получения данных, это отношения hasManyThrough
попробуй это :
в модели Заказать
public function products(){
return $this->hasManyThrough(Colli::class, Product::class)->withPivot('quantity');
}