Php Yii对不同表的两列进行唯一验证,即复合唯一验证
我有两个表Php Yii对不同表的两列进行唯一验证,即复合唯一验证,php,validation,yii,composite-key,unique-constraint,Php,Validation,Yii,Composite Key,Unique Constraint,我有两个表table1和table2,每个表都有一个名为email的列以及其他不同的列。我想要的是一个验证器,它在两列的email字段中查找唯一性。我发现了一个检查同一个表的多个列的方法。如何扩展它以使其适用于多个列?您可以使用className属性为其他类指定 文件: 应用于查找正在验证的属性值的ActiveRecord类名。默认为null,表示使用当前正在验证的对象的类。您可以在此处使用路径别名引用类名。 让我们在两个模型中拥有一个名为common_attr的属性: class Model1
table1
和table2
,每个表都有一个名为email
的列以及其他不同的列。我想要的是一个验证器,它在两列的email
字段中查找唯一性。我发现了一个检查同一个表的多个列的方法。如何扩展它以使其适用于多个列?您可以使用className属性为其他类指定
文件:
应用于查找正在验证的属性值的ActiveRecord类名。默认为null,表示使用当前正在验证的对象的类。您可以在此处使用路径别名引用类名。
让我们在两个模型中拥有一个名为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'),
}
}
要检查多个表中的组合键验证,可以使用CUniqueValidator的criteria属性。
无需任何扩展
文档:标准属性
公共标准;
其他查询条件。这将与检查属性值是否存在于相应表列中的条件相结合。此数组将用于实例化CDbCriteria对象。
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',
)),
}
}
在Yii2中 简称:
['common_attr', 'unique'],
['common_attr', 'unique', 'targetClass' => AnotherClass::class],
冗长的:
class One extends \yii\db\ActiveRecord
{
public function rules()
{
return [
['common_attr', 'unique'],
['common_attr', 'unique', 'targetClass' => Two::class],
];
}
}
class Two extends \yii\db\ActiveRecord
{
public function rules()
{
return [
['common_attr', 'unique'],
['common_attr', 'unique', 'targetClass' => One::class],
];
}
}
此外,您还可以对targetAttribute使用多个唯一键:
[
'common_attr',
'unique',
'targetClass' => One::class,
'targetAttribute' => ['common_attr', 'one_more_attr']
]