Массовое обновление данных в бд на laravel/lumen (innoDB)

21 January 2016
#Laravel#Lumen#MySQL#PHP

Суть проста, если нужно обновлять много данных, то просто заключите часть запросов в транзакции.

    // Получаем данные, к примеру из базы
    $data = DB::table('users')->get();
    $counter = 0;
    foreach($data as $value){
        // Если счётчик в 0, то стартуем транзакцию
        if($counter == 0)
            DB::beginTransaction();
        }
        $counter++;
    
        // Выполняем какие-то действия
        $type = $value->type === 2?5:1;
    
        // Обновляем данные
        DB::table('users')->where('id', $value->id)->update(array('type' => $type));
    
        // Счётчик достиг нужного порога - коммитим изменения в DB
        if($counter >= 999){
            DB::commit();
            $counter = 0;
        }
    }
    
    // Снова коммит для оставшихся
    DB::commit();

Таким способом обновление данных займёт гораздо меньше времени.