PostgreSQL, varchar, поиск без учёта регистра

Господа, помогите чайнику!

В тридевятой базе данных PostgreSQL жила-была таблица users с полем login varchar(32) и был у неё индекс CREATE UNIQUE INDEX users_login_idx ON users ((lower(login))); А в тридесятом приложении жила-была модель ActiveRecord для этой таблицы с правилом валидации unique для поля login:


public function rules() {

	return array(

		array("login", "unique")

	);

}

То есть, предполагается, что логины уникальны без учёта регистра, и логиниться можно как под именем GeNNaDy, так и под именем gennady, и будет это один и тот же юзер. Допустим, юзер gennady уже существует. Теперь, когда мы пытаемся создать юзера GeNNaDy, правило валидации unique для него не срабатывает, так как SELECT * FROM users WHERE login = ‘GeNNaDy’ ничего не находит из-за того, что varchar в PostgreSQL чувствителен к регистру. Аналогично и Геннадий не может в поле логина ввести “GENNADY”, потому что Users::model()->findByAttributes(“login” => “GENNADY”) ничего не находит.

Внимание, вопрос. Какое магическое заклинание нужно наложить на модель Users, чтобы она искала по полю login без учёта регистра, например, выполняя запрос SELECT * FROM users WHERE login ILIKE "GeNNaDy" или SELECT * FROM users WHERE lower(login) = lower("GeNNaDy")? Маны навалом, Spell Power = 10. TIA.

http://www.yiiframework.com/doc/api/1.1/CUniqueValidator#caseSensitive-detail

P.S. Сказки у вас время писать есть, а минуты в API поглядеть не нашлось :)

Большое спасибо! Валидация заработала, однако это не решает проблемы с Users::model()->findByAttributes(“login” => “GENNADY”), который должен делать WHERE lower(login) = lower(‘GENNADY’). Как-то изменить CDbCriteria в beforeFind()?

P. S. :blink: API по CUniqueValidator прочитал раз пять, как не заметил caseSensitive - понятия не имею :)

И опять далеко ходить не надо. Посмотрите код CUniqueValidator.validateAttribute(), ищите фразу LOWER.