Laravel:将 2 个查询合并为 1 个
Posted
技术标签:
【中文标题】Laravel:将 2 个查询合并为 1 个【英文标题】:Laravel: combine 2 queries into 1 【发布时间】:2020-12-06 02:01:01 【问题描述】:我有以下关系:
'订单' -> 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's
$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 查询构建器的了解都比较少,所以如果有更好的方法来编写查询(也许更有说服力?),请告诉我!
【问题讨论】:
【参考方案1】:您可以使用关系来获取数据, 这种关系是 hasManyThrough
试试这个:
按模型顺序
public function products()
return $this->hasManyThrough(Colli::class, Product::class)->withPivot('quantity');
【讨论】:
以上是关于Laravel:将 2 个查询合并为 1 个的主要内容,如果未能解决你的问题,请参考以下文章