Предыдущая статья этого цикла планировалась и даже объявлялась как последняя. Но, жизнь внесла свои коррективы и спустя полтора года я вновь возвращаюсь к этой теме по причине того, что использование штатного механизма RBAC фреймворка Yii 2 при использовании в качестве СУБД PostgreSQL сопряжено с некоторыми не совсем очевидными особенностями.
Дело в том, что в таблице auth_assignment, которая хранит связи между пользователями и их правами поле user_id (хранит id пользователя) имеет тип varchar (строка). В то время, как во многих (если не в большинстве) случаев id пользователя в соответствующей таблице является целым числом.
В случае MySQL попытка получить роли для пользователя при такой структуре таблицы ещё может быть успешной. Но, с PostgreSQL это не пройдёт и в результате выполнения запроса, который подразумевает JOIN с таблицей auth_assignment будет критическая ошибка.
Чтобы этого избежать следует перед добавлением пользователей и их ролей преобразовать тип данных столбца user_id.
Сделать это лучше всего в миграции выполнив несложный запрос:
this->execute('ALTER TABLE "auth_assignment" ALTER COLUMN "user_id" TYPE bigint USING ("user_id"::numeric::bigint)');
Если же ваш проект предполагает поддержку нескольких СУБД, то можно воспользоваться способом приведённым в одной из предыдущих статей, чтобы данный запрос не выполнялся в случае использования других СУБД.
if($this->isPostgreSQLdB(Yii::$app->getDb()->dsn)){ $this->execute('ALTER TABLE "auth_assignment" ALTER COLUMN "user_id" TYPE bigint USING ("user_id"::numeric::bigint)'); }
Другие статьи из этого цикла