【发布时间】:2014-04-15 12:50:14
【问题描述】:
我在我的数据库中的两列上添加了一个唯一键;
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。
但是,由于某种原因,它没有触发验证失败,而是抛出了 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 应该处理模型的规则方法中的验证错误?
【问题讨论】:
标签: php mysql yii unique-constraint