Laravel-Excel 2,更快地插入数据

标签 laravel laravel-query-builder laravel-excel

这是我用来将 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");
}

当我有“少量”数据时(假设 Excel 文件中的行数少于 5000 行),此方法效果很好。但我需要处理一个大型 Excel 文件,该文件包含大约 140 万行,分为多个工作表。我怎样才能使我的方法更快?有什么建议吗?

编辑:我将使用答案评论之一的链接上的代码编辑问题:

$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");
}

大块的东西对我有用。

最佳答案

是的,您可以,而不是执行 X(数据库请求数)* N(工作表数),尝试执行简单的批量插入,这只会花费您循环保存 X * N 数据库请求的数据的复杂性,这里有一个示例:

$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] ;
  }
  DB::table('medidores')->insert($bulk_data);
  DB::commit();
} catch (\Exception $e) {
  DB::rollback();
  return redirect()->route('myroute')->withErrors("Some error message");
}

有关数据库请求的更多说明,您可以引用此答案: https://stackoverflow.com/a/1793209/8008456

关于Laravel-Excel 2,更快地插入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50321679/

相关文章:

php - Laravel:向 1000 多个用户发送通知

routes - laravel 抛出 MethodNotAllowedHttpException

laravel addSelectRaw() - 如何在 addSelect() 中绑定(bind)变量?

excel - 如何在 laravel excel 版本 3 中添加列的标题和总和值?

php - 如何将变量传递给 Laravel 中的服务提供者?

php - 在 Laravel 5.1 中使用 Easy RDF

laravel - Eloquent 的 Model::query() 是什么意思?

mysql - 每当创建模态的新实例时插入一个具有值的字段

php - 可以向excel导入添加多个参数吗?

php - 如何在 laravel 中读取 xls 文件 - laravel-excel