Yii不验证2列的唯一索引

时间:2014-04-15 12:50:14

标签: php mysql yii unique-constraint

我在数据库中的两列上添加了一个唯一键;

ALTER TABLE `foo`
  ADD UNIQUE KEY `foo_uk` (`field1`, `field2`);

这是正常工作,如果我尝试添加一行,其中这两个字段的值已存在于另一行中,则会出现完整性约束违规。

然而,我无法让Yii接受克制。

在我的模型中,我添加了一条规则;

public function rules()
{
    return array(
        ...
        array('field1', 'unique', 'criteria'=>array(
            'condition'=>'`field2`=:field2',
            'params'=>array(
                ':field2'=>$this->field2
            )
        ),
        ...
    );
}

我可以看到此规则在保存模型时正在运行,并且在验证期间执行以下查询:

SELECT 1 FROM `foo` `t` WHERE (`field2`=:field2) AND (`t`.`field1`=:ycp0) LIMIT 1

我已经通过在mysql中运行此命令进行检查,并且它返回了正确的结果,当表为空时,它返回0组,当我尝试添加相同的行时,它返回1。< / p>

但是,出于某种原因,它不会在验证时触发失败,而是抛出CDbException:

CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity
constraint violation: 1062 Duplicate entry 'field1TestData-field2TestData' for
key 'foo_uk'. The SQL statement executed was: INSERT INTO `foo` (`field1`,
`field2`...etc) VALUES (:yp0, :yp1...etc)

我希望在保存之前进行验证可以优雅地抛出错误并带我回到带有正确错误消息('field1' and 'field2' must be unique或其他任何内容)的表单?

请有人指出我正确的方向,这里发生了什么。我是否需要创建自己的验证方法,我假设Yii应该处理验证错误,因为它在模型的规则方法中?

1 个答案:

答案 0 :(得分:1)

可能此扩展程序可以帮助您:unique-attributes-validator

从扩展程序页面:

  

Yii带有一堆验证器,包括一个唯一的验证器,用于验证属性值在相应的数据库表中是否唯一。但是,如果您的数据库唯一约束包含多个属性,该怎么办?

这就是我在我的项目中使用的。

这是一个例子

public function rules() {
    return array(
        array('firstKey', 'UniqueAttributesValidator', 'with'=>'secondKey'),
    );
}