Проблема: есть функции, которые одновременно изменяют >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 и выполнить разом? Если да, то как?