Mysql查询或Eloquent根据订单和项目级别的项目和折扣计算总计

时间:2016-03-31 15:43:44

标签: php mysql laravel query-optimization laravel-5.2

我有订单和Order_Items表。我需要在应用折扣和订单折扣后计算包含增值税和增值税的总额。如何计算最终价格inc和ex vat?我使用Laravel并使用关系,一旦我有大约20k订单和70k order_items,它就变得非常慢。

订单

  • ID(PK)
  • USER_ID
  • REGISTER_ID
  • sale_time
  • has_discount
  • discount_is_percentage
  • DISCOUNT_AMOUNT

ORDER_ITEMS

  • ID(PK)
  • ORDER_ID(FK)
  • has_discount
  • discount_is_percentage
  • DISCOUNT_AMOUNT
  • VAT_RATE

首先,我使用折扣计算物品等级的价格ex和inc vat。然后添加它们以获得销售总额。通过对总额应用订单折扣来计算订单折扣。将折扣应用于商品以计算折扣后的商品价格。然后添加项目金额以获得订单总额。我在Laravel模型和集合中都这样做,如果有几千个条目,一切正常,但随着列表的增长,它需要更长更长的时间。

我应该将计算值直接存储在订单表中吗?或者我如何优化此查询。我需要报告长达一年的时间,对于特定的客户,一年内的计数可以达到几百万。

此外,我将按不同的列(user_id,register_id)和日期和小时进行分组报告。所以Eloquent收藏现在有效,但实际上很慢。

我正在使用laravel 5.2

1 个答案:

答案 0 :(得分:0)

我建议您将accessors添加到Order模型中。

这样的事情可以解决问题:

// comment it out if you don't need it in your model
protected $appends = ['total'];

public function getTotalAttribute()
{
    $items = $this->items();
    // do the needed calculations

    return $result;
}

<强> 修改

由于主要问题是性能问题,您可以使用mutatorqueue calculate / save process。因此,您将计算order保存/更改的总计,并将结果放入orders表。