我有3个表,产品,订单和 order_product ,第3个是包含名为的字段的数据透视表product_quantity 记录与相应产品相关的订单的产品数量。现在我想计算在给定时期内销售的总产品,我得到了这样的订单:
Order::whereBetween('created_at', array($start_date, $end_date))->where('status', $order_status_completed)->get()
接下来,我肯定不想迭代每个获取的订单来总结 product_quantity ,因为这样就可以了解杀死性能的方法。我知道,只要使用 - > sum(' product_quantity'),我就能做到这一点吗?
答案 0 :(得分:1)
您的声明会为您提供您感兴趣的订单集。然后,您可以使用ID列表查询order_product表。类似的东西:
// get the orders
$orders = Order::whereBetween('created_at', array($start_date, $end_date))->where('status', $order_status_completed)->get();
// get an array of the ids
$orderIds = $orders->lists('id');
// sum the order_product.product_quantity for the related orders
$total = DB::table('order_product')->whereIn('order_id', $orderIds)->sum('product_quantity');
如果您不关心订单对象本身,您可以直接获取ID:
// get the order ids
$orderIds = Order::whereBetween('created_at', array($start_date, $end_date))->where('status', $order_status_completed)->lists('id');
// sum the order_product.product_quantity for the related orders
$total = DB::table('order_product')->whereIn('order_id', $orderIds)->sum('product_quantity');
如果要使用子查询代替两个单独的查询,可以执行以下操作:
$total = DB::table('order_product')
->whereIn('order_id', function($q) use ($start_date, $end_date, $order_status_completed) {
$q->select('id')
->from((new Order())->getTable())
->whereBetween('created_at', array($start_date, $end_date))
->where('status', $order_status_completed);
})
->sum('product_quantity');