在Doctrine2/Symfony2中的重复条目上插入ignore

sef*_*rov 17 doctrine symfony doctrine-orm

如何使用Doctrine2忽略重复的条目?

错误示例:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'symfony' for key 'UNIQ_389B783389B783'
Run Code Online (Sandbox Code Playgroud)

And*_*nko 16

Symfony 3中,您可以重置管理器并在捕获异常后通过调用对象的resetManager()方法继续使用它.DoctrineUniqueConstraintViolationException

这是一个例子:

try {
  $em = $this->getDoctrine()->getManager();
  $entity = Product::create()
    ->setTitle('Some title')
    ->setUrl('http://google.com');
  $em->persist($entity);
  $em->flush();
}
catch (UniqueConstraintViolationException $e) {
  $this->getDoctrine()->resetManager();
}
Run Code Online (Sandbox Code Playgroud)

  • 我会对这种类型的最新答案感兴趣.现在不推荐使用resetManager(). (3认同)
  • 不错的分享!(即resetManager()) (2认同)
  • 如果您正在使用symfony 3/4,请使用`composer require symfony / proxy-manager-bridge`。 (2认同)

ILi*_*cos 14

这是Doctrine的麻烦之一,它不可能执行INSERT/UPDATE Ignore,有一些解决方法,比如创建一个检查行是否存在的方法,如果确实存在,那么就跳过它.

您可以捕获异常,以便您的脚本不会以异常结束.但是,实体经理将被关闭,您将无法再使用它.您仍然可以使用PDO,但您可以在数据库中插入一条记录,表明您的批处理失败,因为X它需要重新启动(这就是我通常所做的).

如果上面的选项都不适合你,最终我最终编写原始SQL来进行批处理,我根本不使用Doctrine,它最终会更快,并且执行INSERT/UPDATE Ignore的能力使它变得毫无疑问.


Cer*_*rad 11

您始终可以捕获异常然后忽略它.请注意,当实体管理器引发异常时,在该请求期间不能再使用实体管理器.