php - Mysql 查询或 Eloquent 根据商品计算总计以及订单和商品级别的折扣

标签 php mysql laravel query-optimization laravel-5

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

订单

  • id(PK)
  • 用户 ID
  • 注册 ID
  • 促销时间
  • 有折扣
  • discount_is_percentage
  • 折扣金额

订单商品

  • id(PK)
  • order_id(FK)
  • 有折扣
  • discount_is_percentage
  • 折扣金额
  • 价格
  • 数量
  • 增值税税率

首先,我计算应用折扣的商品级别的不含税和含税价格。然后将它们相加即可得到销售总额。通过将订单折扣应用于总额来计算订单折扣。将折扣应用于商品以计算折扣后的商品价格。然后将商品金额相加即可得到订单总额。我在 Laravel 模型和集合中完成了所有这些工作,如果有几千个条目,那么一切都可以正常工作,但随着列表的增长,它需要越来越长的时间。

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

我还将制作按不同列(user_id、register_id)以及按天和小时分组的报告。所以 Eloquent 收集目前可以工作,但速度非常慢。

我使用的是 Laravel 5.2

最佳答案

我建议您将访问器添加到您的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;
}

编辑

由于主要问题是性能,您可以改用更改器(mutator)排队计算/保存过程。因此,您可以计算 order 保存/更改的总计,并将结果放入 orders 表中。

关于php - Mysql 查询或 Eloquent 根据商品计算总计以及订单和商品级别的折扣,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36337963/

相关文章:

php - 通过php将一个表中的一个字段与mysql中另一表中的多个字段进行比较

php - Laravel - 按关系表排序

mysql - 如何在 MySQL 中移动列值?

php - 在 Laravel 4 中使用命名空间类作为 View Composer?

php - 防止 "corruption"

javascript - 无法让 ajax 显示在页面中,但可以在谷歌元素检查器中看到

mySQL更新表向列添加字符串

php - mysql_select_db 使用 POST 变量

php - Laravel: Controller 中有 2 个数据库查询,而 1 个值取决于第一个查询

php - Laravel 嵌套查询生成器 Json 响应