Symfony 2.6 / Doctrine ORMException:EntityManager已关闭

时间:2015-04-08 18:51:36

标签: php database symfony doctrine-orm doctrine

我从excel文件导入用户。我创建了实体经理:

$em = $this->getDoctrine()->getManager();

这是我的循环:

...
for ($i=2; $i<=count($usersdatas); $i++) { // $userdatas: an array of users imported from excel
    $nuser = new User();
    $nuser->setEmail($usersdatas[$i]['A']); // email is unique in db
    $nuser->setFname($usersdatas[$i]['B']);
    $nuser->setLname($usersdatas[$i]['C']);
    $nuser->addChannel($channel); //ManytoMany relation
    $em->persist($nuser);
    $em->flush();
}
...
  • 电子邮件字段在db中是唯一的,我不想在刷新(db验证)之前检查重复
  • 我想逐个清除日志原因(不是批量插入)。
  • 我的所有其他代码和文件(实体,服务,配置......)都是正确的,没有错误。

第一个问题是,如果其中一行有一个存在于db(重复)中的电子邮件,则循环会因db的异常而中断。 我通过这个简单的改变解决了这个问题:

...
try {
    $em->persist($nuser);
    $em->flush();
} catch (\Exception $e) {
    ...
}
...

下一个问题是&#34; EntityManager已关闭&#34;例外。如果一封电子邮件重复,EntityManager($ em)将自动关闭。 我通过在try / catch:

之前创建$ em来解决这个问题
...
if (!$em->isOpen()) {
    $em = $em->create(
    $em->getConnection(), $em->getConfiguration());
}
...

一切都好。但是我向用户添加频道有一个很大的问题:

...
$nuser->addChannel($channel); //ManytoMany relation
...

$ channel不是新的。但是在关闭并创建EntityManager之后,系统认为它是新的在线持久化(如果没有错误,$ channel将成功添加):

ORMInvalidArgumentException {#1400 ▼
  #message: "A new entity was found through the relationship 'My\UserBundle\Entity\User#channels' that was not configured to cascade persist operations for entity: My\PostBundle\Entity\Channel@000000002768057d0000000046371762. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist  this association in the mapping for example @ManyToOne(..,cascade={"persist"}). If you cannot find out which entity causes the problem implement 'My\PostBundle\Entity\Channel#__toString()' to get a clue."
  #code: 0
  #file: "...\vendor\doctrine\orm\lib\Doctrine\ORM\ORMInvalidArgumentException.php"
  #line: 91
  -trace: array:13 [▶]
}

我所有的问题都来自重新创建EntityManager。 我认为这是一个错误。验证数据库端的数据(Unique,Null,Foreign Keys,...)很常见。 db错误后关闭EntityManager意味着在发生任何错误后我们无法与db通信。

我有两个问题:

  1. 有没有办法阻止EntityManager关闭?!
  2. 我可以使用DBAL Doctrine导入我的用户吗? (用户可能有重复的电子邮件)

1 个答案:

答案 0 :(得分:3)

例外情况适用于特殊情况。它们旨在让您清理然后返回一个友好的错误。它们不是为验证而设计的。

您在这里使用它们的方式是说&#34;是否可以添加此用户?&#34;如果没有,请重新启动数据库。也就是说,阻止实体管理器管理器抛出异常,而不是在抛出异常后继续进行。

因此,如果您确定实体经理正在抛出异常并在您尝试添加重复用户时关闭,请检查用户是否重复之前尝试添加它们。

但是,您在上面说过,您不想使用这种方法。在这种情况下,您需要编写自己的SQL查询,并且可以使用DBAL(或只是原始PDO)并自己处理SQL响应。