【问题标题】:How to make sales report more "scalable"?如何让销售报告更“可扩展”?
【发布时间】:2018-09-08 17:33:56
【问题描述】:

我构建了一个应用程序来跟踪销售情况。在我的客户视图中,我想要一个包含每位客户总销售额的列,但随着客户群的增长,列表加载速度越来越慢。这就是我所做的(简化):

控制器:

$customers = App\Customer::get();

查看:

@foreach ($customers as $customer)
{{ $customer->name }} {{ $customer->totalSales() }}
@endforeach

型号:

public function totalSales()
{
     $invoiceLines = InvoiceLine::whereHas('invoice', function ($query) {
        $query->where('customer_id', $this->id);
     })->get();

     $sales = $invoiceLines->reduce(function ($carry, $invoiceLine) {
        return $carry + ($invoiceLine->quantity * $invoiceLine->pricePerUnit);
     });

     return $sales ?: 0;
}

让这个视图/报告更“可扩展”的最佳方法是什么?

我一直在考虑创建一个命令来计算每个客户一夜之间的总销售额并将结果放入客户表中,但这意味着白天的数字不会准确......

【问题讨论】:

    标签: php sql laravel-5


    【解决方案1】:

    这似乎是一个非常有趣的问题。

    我一直在考虑创建计算总数的命令 一夜之间每个客户的销售额并将结果放入客户表中

    这是一个不错的选择。

    但这意味着白天的数字不会准确......

    您可以通过执行以下操作来保持数字的准确性: 每次开具发票时增加客户表计数。

    这应该适用于总销售额。

    【讨论】:

      【解决方案2】:
      1. 确保customer_id 列上有索引。
      2. 搜索“使用 laravel 在 2 列上执行 SQL SUM”的方法。
      3. 尝试找到一些方法在 2 上使用 GROUP BY 执行“SQL SUM。这样做将替换 #2
        • 加速应用程序的一个好方法是避免循环调用数据库。这就是#3 的建议(在这种情况下,循环是视图中的@foreach,数据库调用是totalSales() 中的InvoiceLine::...->get();

      添加索引(如果缺少)并减少对数据库的调用次数将产生最佳结果。

      我对 Laravel 的了解有限,但使用原始 SQL 执行此操作的一种方法是:

      SELECT c.name, ts.totalSales
      FROM customer c
      INNER JOIN (
        SELECT customer_id, SUM(quantity * pricePerUnit) as totalSales
        FROM invoice
        GROUP BY customer_id
      ) ts ON c.id = ts.customer_id
      

      您可以看到您尝试打印的所有数据是如何一次提取的?我假设你想尝试使用 Laravel 的 Eloquent 东西来编写它。

      【讨论】:

        【解决方案3】:

        根据上面的答案,我得出了以下解决方案:

        我创建了一个事件:App\Events\InvoiceSaved,每次“触及”(创建、更新或删除)发票时都会发送该事件。 App\Events\InvoiceSaved 事件将计算客户的总销售额并将结果添加到客户表(额外字段 total_sales)。现在我可以只查询我的客户表并需要查询一个关系。加载时间从 7 秒下降到 0.5 秒!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-05
          • 2015-11-13
          • 2011-05-28
          相关资源
          最近更新 更多