Symfony 2+原则:如何支持SQLSTATE[23000]:违反完整性约束:1062重复条目


Symfony 2 + Doctrine: How to supress SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry

我看了几篇文章,但找不到一个有效的解决方案。

我的问题很简单:

我有一个实体,比如idurltitle。URL应该是唯一的(在MySQL PDO中)。我已经成功地创建了实体和模式,没有任何问题。现在,当我遍历一些记录时,我在每个记录上调用persist(),最后调用flush()。问题是,当我尝试为URL插入重复条目时,会出现异常。如何抑制它?

当插入一个重复的条目时,它应该跳过它并插入其余的条目。不需要事件、ONUPDATE语句、触发器和所有这些花哨的东西。

我尝试过捕捉persistflush()抛出的任何异常,但似乎都无法正确执行。

欢迎有任何想法,谢谢!

编辑:在这里找到了我的解决方案:Symfony2控制器赢得了';t捕获异常

在Symfony 2.1+中,使用'Doctrine'DBAL'DBALException而不是'PDOException捕获它。

try {
    ...
} catch ('Doctrine'DBAL'DBALException $e) {
    // ... Error on database call
}

请注意,如果您正在删除具有父关系的条目,则Symfony 2.1中会抛出PDOException。但为了抓住它,你将使用ihsan 建议的声明

    try {
        $em = $this->getDoctrine()->getEntityManager();
        $em->remove($entity);
        $em->flush();
    } catch('Doctrine'DBAL'DBALException $e)
    {
        // ...
    }
try {
    $em->flush()
} catch ('PDOException $e) {
    // ... Error on database call
}

更好的方法是指定一个验证约束,以避免必须处理此异常。在yaml(取自symfony文档)

Acme'SomeBundle'Entity'Item:
    constraints:
        - Symfony'Bridge'Doctrine'Validator'Constraints'UniqueEntity: url
相关文章: