Они добавили поддержку уникальных составных ключей в следующем выпуске кандидата Yii1.14rc, но вот (еще одно) решение.Кстати, этот код использует то же самое «attributeName» в правилах, которые фреймворк Yii будет использовать в следующем официальном релизе.
protected / models / Mymodel.php
public function rules()
{
return array(
array('name', 'uniqueValidator','attributeName'=>array(
'name', 'phone_number','email')
),
...
- 'name' в начале правила - это атрибут, к которому будет прикреплена ошибка проверки и которая впоследствии будет выведена в вашей форме.
- 'attributeName' (массив) содержит массив ключей, которые вы хотели бы проверить вместе как комбинированный ключ.
protected / components / validators / uniqueValidator.php
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.');
}
}
}
Вы можете использовать столько атрибутов, сколько хотите, и это будет работать для всех ваших CModels.Проверка выполняется с помощью «существует».
protected / config / main.php
'application.components.validators.*',
Возможно, вам придется добавить вышеуказанную строку в вашу конфигурацию в массиве 'import', чтобы uniqueValidator.phpбудет найден приложением Yii.
Положительные отзывы и изменения приветствуются!