public function rules()
{
return array(
array('firstField', 'myTestUniqueMethod'),
);
}
public function myTestUniqueMethod($attribute,$params)
{
//... and here your own pure SQL or ActiveRecord test ..
// usage:
// $this->firstField;
// $this->secondField;
// SELECT * FROM myTable WHERE firstField = $this->firstField AND secondField = $this->secondField ...
// If result not empty ... error
if (!$isUnique)
{
$this->addError('firstField', "Text of error");
$this->addError('secondField', "Text of error");
}
}
// a1 needs to be unique
['a1', 'unique']
// a1 needs to be unique, but column a2 will be used to check the uniqueness of the a1 value
['a1', 'unique', 'targetAttribute' => 'a2']
// a1 and a2 need to be unique together, and they both will receive error message
[['a1', 'a2'], 'unique', 'targetAttribute' => ['a1', 'a2']]
// a1 and a2 need to be unique together, only a1 will receive error message
['a1', 'unique', 'targetAttribute' => ['a1', 'a2']]
// a1 needs to be unique by checking the uniqueness of both a2 and a3 (using a1 value)
['a1', 'unique', 'targetAttribute' => ['a2', 'a1' => 'a3']]
class uniqueValidator extends CValidator
{
public $attributeName;
public $quiet = false; //future bool for quiet validation error -->not complete
/**
* Validates the attribute of the object.
* If there is any error, the error message is added to the object.
* @param CModel $object the object being validated
* @param string $attribute the attribute being validated
*/
protected function validateAttribute($object,$attribute)
{
// build criteria from attribute(s) using Yii CDbCriteria
$criteria=new CDbCriteria();
foreach ( $this->attributeName as $name )
$criteria->addSearchCondition( $name, $object->$name, false );
// use exists with $criteria to check if the supplied keys combined are unique
if ( $object->exists( $criteria ) ) {
$this->addError($object,$attribute, $object->label() .' ' .
$attribute .' "'. $object->$attribute . '" has already been taken.');
}
}
}
8条答案
按热度按时间vfhzx4xs1#
这可以由Yii自己来完成,你不需要一个扩展。然而扩展可以帮助清理
rules()
方法,如下所述:http://www.yiiframework.com/extension/unique-attributes-validator/
以下代码(从该站点复制)无需使用扩展即可工作:
如果
$this->secondKey
的值在rules()
-方法中不可用,您可以在CActiveRecordsbeforeValidate()
-方法中添加验证器,如下所示:cygmwpex2#
你不需要rules()方法的复杂内容,也不需要第三方扩展。只需创建你自己的验证方法。这比你自己做要容易得多。
l0oc07j23#
Yii1:
http://www.yiiframework.com/extension/composite-unique-key-validatable/
Yii2:
http://www.yiiframework.com/doc-2.0/yii-validators-uniquevalidator.html
2eafrhcq4#
他们在Yii1.14rc的下一个候选版本中增加了对唯一组合键的支持,但这里有另一个解决方案。顺便说一句,这段代码在规则中使用了相同的'attributeName',Yii框架将在下一个正式版本中使用。
保护的/模型/我的模型.php
受保护的/组件/验证器/唯一验证器.php
你可以使用任意多的属性,这对你所有的CModel都有效。检查是用“exists”来完成的。
保护/配置/主.php
您可能需要将上面的行添加到'import'数组中的config中,这样uniqueValidator.php才能被Yii应用程序找到。
积极的反馈和变化是非常欢迎的!
mw3dktmi5#
在Yii2中:
sg3maiej6#
基于上面的函数,下面是一个可以添加到ActiveRecord模型中的函数
你可以这样使用它,
sq1bmfud7#
这很简单,在数组中包含一个在扩展类中创建的参数。
下一个代码在Model中。
下一个代码是从类
ValidateNames
到扩展文件夹中。z9zf31ra8#
也许你可以把这个
rules
添加到你的代码中