更快地填充数据mysql和php


Faster way to populate data mysql and php

嗨,我正在使用Laravel 5和Laravel Excelhttp://www.maatwebsite.nl/laravel-excel/docs.

我在一个报告模块中工作,该模块将导出到excel。我有三张桌子。

Forms, FormsResponses and Metrics

Forms
->id
->phone_number
->calldatetime
FormsReponses
->id
->Forms_id
->Metrics_id
->Response
Metrics
->id
->description

正如你所看到的,我有一个表单,它有一个指标列表,然后用户将为每个指标选择响应。呼吸可以是"是"、"否"、"不适用"。我有这份报告。假设我现在有3个度量,如果我们添加新的度量,这些度量可以增加。

Metrics ID|Metrics Description|Phone1|Phone2|Phone3 ...
__________|___________________|______|______|______|___
1         |Sample1            |Yes   |Yes   |Yes 
__________|___________________|______|______|__________
2         |Sample2            |Yes   |No    |No
__________|___________________|______|______|__________
3         |Sample3            |Yes   |No    |No

所以我所做的是在每个指标上显示每个电话号码的响应。我有一个开始日期和结束日期。这份报告将以我已有的excel文件输出。因此,这份报告纵向扩展(取决于指标的数量),横向扩展取决于我在日期范围内获得的电话号码的数量。我可以适当地宣传它。但是太慢了。处理需要花费大量的时间,我发现这是我的代码中搜索响应的原因。我的代码:

$query = "SELECT id, phone FROM qcv.forms WHERE calldatetime >= '$from' AND calldatetime <= '$to' ORDER BY id ASC ;";
$phone = DB::connection('mysql')->select($query);
      $metrics = Metric::all();
      $metric_start = 10;
      $start = "D";
      $count = 10;
      foreach ($phone as $key => $value2) // Populate Phone Numbers Horizontally
      {
          $sheet->cell($start.'9', $value2->phone);
          // This will fill the responses for each number
          foreach ($metrics as $key => $value)
          {
              $responses = FormResponses::where('form_id', '=', $value2->id)->where('metrics_id', '=', $value->id)->get();
              $sheet->cell($start.$count, $responses[0]->response);
              // Populate Metrics Vertically
              $sheet->cell('C'.$count, $value->question);
              $sheet->cell('B'.$count, $value->description);
              $sheet->cell('A'.$count, $value->metrics_name);
             $count++;
          }
          $start++;
          $count = 10;
      }

$responses = FormResponses::where('form_id', '=', $value2->id)->where('metrics_id', '=', $value->id)->get();

这条线占用了时间,因为对于每个电话号码,它都必须搜索我所拥有的每个指标的响应。想象一下,如果我有30个指标和150个电话号码。这需要时间。有更好的方法吗?

使用fromArray方法不是更好的方法吗?它似乎更高效,而不是自己创建来跟踪它。我在为我们公司创建的出口脚本中使用了相同的策略。

创建您想要的数组,如:

$forms = [
    ['id', 'phone_number', 'calldatetime'], // headers
    // total of 5 dataset items
];
$formsReponsesStartAtRow = $formsStartAtRow + count($forms) + ;
$formsReponses = [
    ['id', 'Forms_id', 'Metrics_id', 'Response'], // headers
    // total of 15 dataset items
];
$metrics = [
    ['id', 'description']
    // total of 100 dataset items
];

当数据准备就绪时,计算每个数组的起始行。

// leave between each dataset 2 rows
$rowSpacing = 2;
$startCol = 'A';
// start cell A1
$startAtRow = 1;
$forms = [...];
// add $forms to the sheet
$sheet->fromArray($forms, null, $startCol . $startAtRow);
// calculate start row from previous $startAtRow
// start cell is: 5 + 2 = 7 = A7
$startAtRow = $startAtRow + count($forms) + $rowSpacing;
$formsReponses = [...];
// add $formsReponses to the sheet
$sheet->fromArray($formsReponses, null, $startCol . $startAtRow);
// calculate start row from previous $startAtRow
// start cell is: 7 + 15 + 2 = 24 = A24
$startAtRow = $startAtRow + count($formsReponses) + $rowSpacing;
$metrics = [...];
// add $metrics to the sheet
$sheet->fromArray($metrics, null, $startCol . $startAtRow);

如果您添加另一个数据集,它将启动:24 + 100 + 2 = 126 = A126

无论何时数据集增长,excel都会对变化进行预测。

希望这对你有帮助。