Laravel总结了旋转表中的字段

时间:2014-10-30 23:52:53

标签: laravel sum pivot

我有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'),我就能做到这一点吗?

1 个答案:

答案 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');