php - Yii 不验证 2 列的唯一索引

标签 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.

但是,出于某种原因,它不会触发验证失败,而是抛出 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' 和 'field2' 必须是唯一的 或任何它会是)?

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

最佳答案

可能这个扩展会帮助你:unique-attributes-validator

从扩展页面:

Yii comes with bucket of validators including a unique validator which validates whether an attribute value is unique in the corresponding database table. But what if your database unique constraint contains more than one attribute?

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

举个例子

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

关于php - Yii 不验证 2 列的唯一索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23084249/

相关文章:

php - HTML/PHP 文件上传

php - 在mysql中使用group by查询和order by查询进行选择

mysql - 选择包含在另一个表的集合中的行

PHP 变量返回空值

mysql - 可以在 Yii 中修复外键而无需在数据库中设置它吗?

php - YII 如何处理自定义 404 错误页面以及其他错误页面

php - 需要帮助让表格从提交区域提交/离开

php - 如何在 cgridview yii 中的 <td> 之后放置一个 <div> 标签?

javascript - Codeigniter - 当选择客户并向他们显示信息时

php - 按上传顺序检索上传的文件 yii php