Задача предельно простая: добавить SELECT FOR UPDATE
. В обсуждении подобного вопроса в оф. репозитории фреймворка нам сообщают, что из коробки такой возможности нет и что решать данную проблему нужно самому.
Так же есть расширение, которое не имеет какого-то смысла вообще, т.к. суть работы SELECT FOR UPDATE
не реализована: отсутствует актуализация данных после блокировки. Придется обновлять записи после блокировки вручную и надеятся, что это отработает корректно.
Еще есть вот такое расширение, но я его особо не смотрел. Вроде рабочее. Если кто-то тестировал или использовал - пишите в комментарии.
Дак что же делать для тех, кто хочет просто применить SELECT FOR UPDATE
? Решение очень простое! Нужно всего лишь...
использовать yii\db\ActiveRecord::findBySql()
!
Пишем метод в модели:
public static function findOneForUpdate(int $id): ?ActiveRecord
{
$sql = self::find()
->where(['id' => $id])
->createCommand()
->getRawSql();
return self::findBySql($sql . ' FOR UPDATE')->one();
}
И все! Вот так просто.