Привет Я использую Laravel 5 и Laravel Excel http://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
Всякий раз, когда ваш набор данных растет, ваше преимущество зависит от изменений.
Надеюсь, это поможет вам.