Yii: Как изменить уникальные критерии?

#php #yii

#php #yii

Вопрос:

 public function rules()
{
    // NOTE: you should only define rules for those attributes that
    // will receive user inputs.
    return array(
        array('entity_category_id, entity_id', 'required'),
        array('preferred','boolean'),

        // unique with condition
        array('email','unique',
            'criteria'=>array(
                'condition' => 'gmail= :gmail OR email= :email',
                'params' => array(':email' => $this->email, ':gmail' => $this->email)
            ),
        ),

        // The following rule is used by search().
        // Please remove those attributes that should not be searched.
        array('id, entity_category_id, entity_id', 'safe', 'on'=>'search'),
    );
}
  

Над уникальным запросом выполните предложение WHERE как (gmail = ‘abc’ ИЛИ email = ‘abc’) И (email = ‘abc)
но я не хочу и условие, я хочу только (gmail = ‘abc’ ИЛИ email = ‘abc’) в предложении where

Комментарии:

1. попробуйте удалить уникальный валидатор?

2. @ramamoorthy_villi произошла ошибка недопустимого правила проверки

3. для этого вам нужно написать свой собственный пользовательский валидатор.. вот ссылка yiiframework.com/wiki/168/create-your-own-validation-rule

Ответ №1:

Это нормально, что критерии добавляются к исходному условию. Из Yii API:

критерии: дополнительные критерии запроса. Либо массив, либо CDbCriteria. Это будет объединено с условием, которое проверяет, существует ли значение атрибута в соответствующем столбце таблицы

Я думаю, что самый простой способ решить вашу проблему — создать свой собственный валидатор в вашем классе модели:

 public function EmailValidator($attribute,$params)
{
    $criteria = new CDbCriteria;
    $criteria->condition = 'gmail= :gmail OR email= :email';
    $criteria->params = array(':email' => $this->email, ':gmail' => $this->email);
    $result = $this->findAll($criteria);
    if(!empty($result)) {
        $this->addError($attribute, 'Email already exists!');
    }
    return;
}
  

И вызовите его в своем rules методе:

 public function rules()
{
    return array(
       //Other rules
       array('email', 'EmailValidator'),
    );
}