php - Symfony 2.6/Doctrine ORMException : The EntityManager is closed

标签 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();
}
...
  • 电子邮件字段在数据库中是唯一的,我不想在刷新(数据库验证)之前检查重复项
  • 出于日志原因,我想一个一个地刷新(不是批量插入)。
  • 我的所有其他代码和文件(实体、服务、配置等)都是正确的,没有错误。

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

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

下一个问题是“The EntityManager is closed”异常。如果一封电子邮件重复,EntityManager ($em) 将自动关闭。 我通过在 try/catch 之前创建 $em 解决了这个问题:

...
if (!$em->isOpen()) {
    $em = $em->create(
    $em->getConnection(), $em->getConfiguration());
}
...

一切正常。但是我在向用户添加 channel 时遇到了一个大问题:

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

$channel 不是新 channel 。但是关闭创建EntityManager后,系统认为是新上线的persist(如果没有错误$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。 我认为这是一个错误。在数据库端验证数据(唯一、空、外键……)很常见。在数据库错误后关闭 EntityManager 意味着我们无法在任何错误后与数据库通信。

我有两个问题:

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

最佳答案

异常(exception)是针对特殊情况的。它们旨在让您清理然后返回一个友好的错误。它们不是为验证而设计的。

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

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

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

关于php - Symfony 2.6/Doctrine ORMException : The EntityManager is closed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29522992/

相关文章:

php - css类属性动态变化

javascript - 使用 PHP 登录和 OAuth2

php - 如何选择数据库中特定列具有值的所有行?

php - jquery函数不适用于多行

android - 如果已反序列化,则不能使用惰性集合

php - 如何表达 symfony 路由占位符不等于某个值

mysql - 如何优化此查询?运行需要 3 分钟

mysql - 在 MySQL 中使用浮点存储超过一百万的值的最大可能值

Symfony2, Controller 中的一个 Action 是否可以有两条路线?

validation - Symfony2 条件形式验证