编程语言
首页 > 编程语言> > PHP-Symfony 2.6 / Doctrine ORMException:EntityManager已关闭

PHP-Symfony 2.6 / Doctrine ORMException:EntityManager已关闭

作者:互联网

我正在从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异常而中断.
我已经通过简单的更改解决了问题:

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

下一个问题是“ EntityManager已关闭”异常.如果一封电子邮件重复,则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.
我认为这是一个错误.在数据库端(唯一,空,外键等)验证数据很常见. db错误后关闭EntityManager意味着发生任何错误后我们无法与db通信.

我有两个问题:

>有什么方法可以防止EntityManager关闭吗?
>我可以使用DBAL Doctrine导入用户吗? (用户可能有重复的电子邮件)

解决方法:

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

您在这里的使用方式是说“可以添加此用户吗?”如果没有,请重新启动数据库.也就是说,停止实体管理器经理引发异常,而不是尝试在引发异常之后继续进行.

因此,如果您在尝试添加重复用户时发现实体管理器正在抛出异常并关闭,请在尝试添加用户之前检查该用户是否重复.

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

标签:doctrine-orm,symfony,doctrine,php,database
来源: https://codeday.me/bug/20191120/2044515.html