2015-07-01 4 views
0

Я работаю над проектом, где мне нужно будет получить не менее 100 тыс. Данных из таблицы SQL (данные представляют собой 6-значный код, индексированный в таблице), экспортируют их в файл CSV и запускают запрос обновления для обновления своего статуса.Массовое обновление на Laravel 5 Collection

Время экспорта занимает всего несколько секунд, но из-за запросов обновления требуется много времени. Я ищу эффективный способ выполнения этой задачи.

Вот мой код:

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

Я ищу лучший способ для обновления этих данных. Какие-либо предложения?

+0

Я думал, что у Laravel 5 был способ выполнить обновление коллекции, а не только на отдельных моделях в этой коллекции –

+0

Нет. Они этого не сделали. Вот список доступных методов, которые вы можете использовать с коллекцией: http://laravel.com/docs/5.1/eloquent-collections#available-methods –

ответ

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); 
+0

Я пробовал ваш код, но столкнулся с проблемами. Во-первых, метод _chunk() _ не мог работать с _ $ query_, он ожидал закрытия в качестве второго аргумента. Во-вторых, когда я зафиксировал его закрытием, он взял все строки из таблицы _code_ вместо указанного количества. –

+0

Я исправил проблему с помощью этого кода: '$ collection = Code :: select ('code') -> где ('status', 0) -> orderBy ('id', 'asc') -> take ($ request-> количество); $ handle = fopen ($ filename, 'w +'); Еогеасп ($ галерею-> Get() -> порций (500) в виде $ кодов) { Foreach ($ коды $ как код) { fputcsv ($ ручка, [ $ код-> код, ]); } } fclose ($ handle); $ collection-> update (['status' => 1]); ' –

+0

хорошая точка, я обновил ответ с этим .. Просто понял, что take() и chunk() не работают вместе .. hmm .. –

Смежные вопросы