Laravel 5 Collection的批量更新

时间:2015-07-01 08:35:02

标签: php mysql laravel eloquent laravel-5

我正在开发一个项目,我需要从SQL表中获取至少100k数据(数据是在表上索引的6位数代码),将它们导出为CSV文件并运行更新查询以更新它们状态。

导出时间只需几秒钟,但由于更新查询需要很长时间。我正在寻找一种有效的方法来完成这项任务。

这是我的代码:

    $filename = 'sample.csv';
    $handle = fopen($filename, 'w+');

    $collection = Code::select('code')->where('status', 0)->take($request->quantity)->get();

    foreach ($collection->chunk(500) as $codes) {
        foreach ($codes as $code) {
            fputcsv($handle, [
              $code->code,
              ]);
              // this update query making the whole process taking long time
              Code::where('code', $code->code)->update(['status' => 1]); 
        }
    }

    fclose($handle);

我正在寻找更新这些数据的更好方法。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

在写完文件后,你不能只进行批量更新吗?

$filename = 'sample.csv';
$handle = fopen($filename, 'w+');

$query = Code::select('code')->where('status', 0)->take($request->quantity);

foreach ($query->get()->chunk(500) as $codes) {
    foreach ($codes as $code) {
        fputcsv($handle, [
          $code->code,
          ]);
    }
}
$query->update(['status' => 1]); // Update all of them in one go

fclose($handle);