Ми}{@лbI4

Блог хеллоуворлдщика

SELECT FOR UPDATE в Yii2

29.06.2018 yii2, select for update, active record

Задача предельно простая: добавить 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();
}

И все! Вот так просто.