Yii对两列不同表的唯一验证即.复合唯一验证

dIn*_*0nG 5 php validation composite-key unique-constraint yii

我有两个表table1,table2每个表都有一个列email与不同的其他列一起命名.我想要的是一个验证器,它在email两个列的字段中查找唯一性.我找到了一个检查多个SAME表列的扩展.如何扩展它以使其适用于多个列?

Raj*_*hal 7

您可以使用className属性为其他类指定..

文档: the ActiveRecord class name that should be used to look for the attribute value being validated. Defaults to null, meaning using the class of the object currently being validated. You may use path alias to reference a class name here.

让我们在两个模型中有一个名为common_attr的属性:

class Model1 extends CActiveRecord{
    public function rules(){
        array('common_attr', 'unique', 'className'=> 'Model1'),
        array('common_attr', 'unique', 'className'=> 'Model2'),
    }
}

class Model2 extends CActiveRecord{
    public function rules(){
        array('common_attr', 'unique', 'className'=> 'Model1'),
        array('common_attr', 'unique', 'className'=> 'Model2'),
    }
}
Run Code Online (Sandbox Code Playgroud)

要检查combined key多个表的验证,您可以使用CUniqueValidator的criteria属性. 不需要任何扩展名

文档:criteria property public array $criteria; additional query criteria. This will be combined with the condition that checks if the attribute value exists in the corresponding table column. This array will be used to instantiate a CDbCriteria object.

class Model1 extends CActiveRecord{

    public function rules(){
        array('common_attr', 'unique', 'caseSensitive'=>false,
                   'criteria'=>array(
            'join'=>'LEFT JOIN model2 ON model2.common_attr=model1.common_attr',
                            'condition'=>'model2.common_attr=model1.common_attr',
        )),
    }
}
Run Code Online (Sandbox Code Playgroud)