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