问题描述
我想为一个复杂的问题(甚至更复杂的问题)找到一个查询。希望有人能帮助我。
我有一个包含许多产品的订单表(多对多关系)。您可以订购产品并选择数量,该数量保存在数据透视表中。
我知道我可以通过他们的产品获得所有订单
administrator
现在我要检索的是一个仅包含每个产品名称一次的对象数组及其所有订单的数量之和。 在这种情况下,产品代表肉类。因此结果应如下所示:
$query = Order::with(['products'=>function($q){
$q->select('name','price','quantity','unit')->orderBy('name','asc');
}]);
如果有人可以提出解决方案,那就太好了!
有些复杂:
每个订单还可以具有许多colli(包装),其中包含许多具有一定数量/数量的产品。 因此,订单表-> manyToMany->科利斯表-> manyToMany->产品表
我需要与上述相同,但现在需要将colli中所有产品的所有数量之和与其他产品的所有数量之和。
感谢您的任何帮助,因为我在文档中找不到很多有关快速加载的信息。
解决方法
您可以尝试一下。
$query = Order::with('products'=>function($q){
$q->select('name','price','unit',DB::raw("SUM(quantity) as total_quantity"))->groupBy('name')->orderBy('name','asc');
});
我希望它对您有用。
,找到第一个问题的答案:
$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的所有产品都可以使用:
$allProductsInAllCollis = DB::query()
->select(['p.id',DB::raw('sum(co.quantity * colp.quantity) as total_colli_quantity')])
->from('products as p')
->join('colli_product as colp','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','col.category_id','c.id')
->groupBy('p.id','category_name');
(不知道为什么我必须在groupBy中传递“ p.name”和“ category_name”,否则会出现sql错误。
现在最后要做的是执行另一个groupBy,将第一个表的“ total_product_quantity”添加到第二个表的“ total_colli_quantity”。如何使用保存在变量中的2个查询来做到这一点?