Можно ли накопить update/insert-запросы, чтобы потом разом их выполнить их через updateAll/batchInsert?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
hermaeus.seeker
Сообщения: 14
Зарегистрирован: 2022.02.11, 17:42

Можно ли накопить update/insert-запросы, чтобы потом разом их выполнить их через updateAll/batchInsert?

Сообщение hermaeus.seeker »

Проблема: есть функции, которые одновременно изменяют >10 000 записей в БД.

Работает это примерно так:

Код: Выделить всё

foreach($query->each() as $item) {
  $item->sold();
  $item->save(false);
}
Из-за такой "поштучной" обработки — процесс изменения идёт довольно медленно.
Конечно, можно использовать batchUpdate(Model::updateAll()). Но здесь возникает проблема DRY, поскольку мы больше не можем использовать больше метод $item->sold(), который выглядит так:

Код: Выделить всё

public function sold()
    {
        $this->changeStatus(self::STATUS_SOLD, time());
        $this->whole_cost = $this->product->price;
    }
 
Нам нужно писать аналогичную функцию для массовой продажи:

Код: Выделить всё

public function batchSold($itemsId, $wholeCost)
{
    return ProductItem::updateAll(['status' => $status, 'whole_cost' => $wholeCost];
}
Как следствие, при изменении метода sold() кто-то может забыть поправить batchSold(), что произведет(а если точнее — уже произвело) к багам. Не говоря уже о побочных эффектах при использовании Event.

Вопрос: Можно ли "накопить" update-запросы, не выполняя их фактически, чтобы потом упаковать в batchUpdate и выполнить разом? Если да, то как?
Ответить