Это основной код метода, который я использую для импорта файла Excel (используя Maatwebsite Laravel-Excel 2) в мою базу данных:
$data = Excel::selectSheetsByIndex(0)->load($file, function($reader) {})->get()->toArray();
DB::beginTransaction();
try {
foreach ($data as $key => $value) {
$med= trim($value["med"]);
$serial = trim($value["nro.seriemedidor"]);
DB::table('medidores')->insert([
"med" => $med,
"serial_number" => $serial
]);
}
DB::commit();
} catch (\Exception $e) {
DB::rollback();
return redirect()->route('myroute')->withErrors("Some error message");
}
Это прекрасно работает, когда у меня «мало» данных(скажем, менее 5000 строк в файле Excel).Но мне нужно работать с большим файлом Excel, который содержит 1,4 миллиона строк, разделенных на более чем 1 лист.Как я мог сделать свой метод быстрее?Любой совет?
РЕДАКТИРОВАТЬ: я буду редактировать вопрос с кодом, который был по ссылке одного из комментариев ответа:
$data = Excel::selectSheetsByIndex(0)->load($file, function($reader) {})->get()->toArray();
DB::beginTransaction();
try {
$bulk_data = [];
foreach ($data as $key => $value) {
$med= trim($value["med"]);
$serial = trim($value["nro.seriemedidor"]);
$bulk_data[] = ["med" => $med,"serial_number" => $serial] ;
}
$collection = collect($bulk_data); //turn data into collection
$chunks = $collection->chunk(100); //split into chunk of 100's
$chunks->toArray(); //convert chunk to array
//loop through chunks:
foreach($chunks as $chunk)
{
DB::table('medidores')->insert($chunk->toArray());
}
DB::commit();
} catch (\Exception $e) {
DB::rollback();
return redirect()->route('myroute')->withErrors("Some error message");
}
Чак был то, что работало для меня.