Как реализовать наблюдение за изменением полей модели если делают update?
Есть такая проблема. Нужно отслеживать все изменения в моделе. Хорошо работал Observer, но это перестало работать, когда начали обновлять модель пачками - ввели групповые обработки. Например, менеджер через админку выделила все несколько тысяч товаров определенного поставщика и запустила скрипт, который заполнит общее поле для них всех.
это будет команда
Items::where('president_id', $president_id)->update(['description => $description]);
Как в этом случае хитро зафиксировать изменения если Обзерверы не работают?
На ум приходит только Сериализовать данные выборки перед и после, а потом запустить очередь для сравнения и логирования.
Решение в лоб приходит такое (надо посмотреть насколько сервер прожует это, но вроде как ничего сильно сложного там нет) -
Собираем ID от items, у которых description не такой же, как и в новом варианте, перед основным запросом на update, чтобы понять, какие модели изменятся. И добавляем эти модели в хранилище как потенциально готовые к событиям.
После этого делаем апдейт, и при его успешном завершении, добавляем в очередь на евенты для идшников.
хороший вариант..Но долго будет. По нескоько тысяч товаров каждый раз считывается. А число поставщиков сейчас более 40ка у которых есть прайсы, а их число растет. И так каждые 10 минут срабатывает воркер, которые загружает товары очередного поставщика. А если еще по одному товары сравнивать, то будет боюсь долгло.
400 000 задач в очереди в час это еще детский лепет. А тут то и меньше. Логика тут одна, получил пул товаров и сразу их в очередь по одному (они для того и созданы) а там уже делаешь то что надо с ними по одному. Если смотреть процесс выполнения задач в консоли то даже сложно прочитать какой именно выполнился job так они пролетают мгновенно.
Для массового update события не выбрасываются. Поэтому и Observer прекратил работать.
Значительно проще будут чем городить сериализацию заменить "массовый update в один запрос" на цикл, где ты будешь обновлять каждую модель по одной. После этого Observer опять будет работать как раньше.