Моя user_level
структура базы данных
| user_id | level |
| 3 | F |
| 4 | 13 |
| 21 | 2 |
| 24 | 2 |
| 33 | 3 |
| 34 | 12+ |
У меня есть другая таблица users
| id | school_id |
| 3 | 3 |
| 4 | 4 |
| 21 | 2 |
| 24 | 2 |
| 33 | 3 |
| 34 | 1 |
Что мне нужно сделать, так это то, что мне придется обновить level
каждого пользователя на основе определенного предварительно определенного условия. Однако моя таблица users
действительно огромна с тысячами записей.
В одном случае я обновляю только записи user_level
для конкретной школы. Скажем, school_id = 3
, я выбираю всех пользователей и связанные с ними уровни, а затем увеличиваю значение уровня на 1 для этих пользователей (F становится 1, 12+ удаляется, а все остальные числа увеличиваются на 1).
Когда я использую al oop до l oop через пользователей, сопоставляю их user_id
и затем обновляю запись, это будут тысячи запросов. Это замедляет работу всего приложения, а также приводит к созданию sh.
Одной идеальной вещью будут laravel транзакции, но я сомневаюсь, оптимизирует ли оно время. Я проверил это простым запросом с около 6000 записей, и он работал нормально. Но по какой-то причине, это не очень хорошо работает с имеющимися у меня записями.
Просто ищу некоторые рекомендации по любым другим методам оптимизации запросов.
ОБНОВЛЕНИЕ
Я реализовал решение, в котором я бы сгруппировал все записи на основе уровня (используя laravel коллекции), а затем мне нужно было только Выпуск 13 обновлений запросов по сравнению с сотнями / тысячами сейчас.
$students = Users::where('school_id', 21)->get();
$groupedStudents = $students->groupBy('level');
foreach ($groupedStudents as $key => $value) :
$studentIDs = $value->pluck('id');
// condition to check and get the new value to update
// i have used switch cases to identify what the next level should be ($NexLevel)
UserLevel::whereIn('userId', $studentIDs)->update(["level" => $nextLevel]);
endforeach;
Я все еще ищу другие возможные варианты.