Использование отдельных заданий для этого было бы действительно рекомендуемым способом, но вы могли бы попробовать следующий код. Идея создания одного запроса на обновление была найдена в https://github.com/laravel/ideas/issues/575. Парень уменьшил время загрузки, и в итоге оказался в 13 раз быстрее.
Обратите внимание, что это не было проверено раньше.
DB::beginTransaction();
try {
$csv = array_map('str_getcsv', file('data.csv'));
// remove the first line
array_shift($csv);
// grab only the players uids and their positions
$positions = array_flip(array_column($csv, 0));
array_walk($positions, static function(&$position, $id) {
$position = "WHEN {$id} THEN {$position}";
});
DB::update("UPDATE `scores`
SET `position` = CASE `player_uid` " . implode(' ', $positions) . " END
WHERE `player_uid` in (" . implode(',', array_keys($positions)) . ")
AND `session_uid` = ?
AND `day` = ?", [$season_uid, $day]);
DB::commit();
return true;
} catch (\Exception $e) {
Log::error($e);
DB::rollBack();
return false;
}
PS: Было бы неплохо написать комментарий об изменении производительности при таком подходе