【问题标题】:Yii not validating unique index over 2 columnsYii 没有验证超过 2 列的唯一索引
【发布时间】: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


    【解决方案1】:

    也许这个扩展会对你有所帮助:unique-attributes-validator

    来自扩展页面:

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

    这是我在项目中使用的。

    这是一个例子

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

    【讨论】:

    • 完美运行,谢谢,我试图在没有扩展的情况下做到这一点,但仍然不知道为什么它不像 Yii 文档中描述的那样工作......但没关系,这会做诀窍:) ta。
    • 是的,我记得我在没有扩展的情况下也遇到了同样的困难,所以我最终使用了它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    相关资源
    最近更新 更多