我从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) {
...
}
...
下一个问题是&#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通信。
我有两个问题:
答案 0 :(得分:3)
例外情况适用于特殊情况。它们旨在让您清理然后返回一个友好的错误。它们不是为验证而设计的。
您在这里使用它们的方式是说&#34;是否可以添加此用户?&#34;如果没有,请重新启动数据库。也就是说,阻止实体管理器管理器抛出异常,而不是在抛出异常后继续进行。
因此,如果您确定实体经理正在抛出异常并在您尝试添加重复用户时关闭,请检查用户是否重复之前尝试添加它们。
但是,您在上面说过,您不想使用这种方法。在这种情况下,您需要编写自己的SQL查询,并且可以使用DBAL(或只是原始PDO)并自己处理SQL响应。