@hermaeus_seeker

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

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

Войдите, чтобы написать ответ

Похожие вопросы