Loops Symfony2、Doctrine2、EntityManager禁用最后的操作
我们有Loops Symfony2、Doctrine2、EntityManager禁用最后的操作,loops,symfony,doctrine-orm,entitymanager,Loops,Symfony,Doctrine Orm,Entitymanager,我们有 foreach ($rwst as $row) { $loopData = XmlFunctions::getXmlAttrAsArray($row); if (!$loopData) { return false; } $oCharacters = new XmlAccountCharacters(); $oCharacters ->setKeyID($this->keyID)
foreach ($rwst as $row)
{
$loopData = XmlFunctions::getXmlAttrAsArray($row);
if (!$loopData)
{
return false;
}
$oCharacters = new XmlAccountCharacters();
$oCharacters
->setKeyID($this->keyID)
->setCharacterID($loopData['characterID'])
->setCharacterName($loopData['name'])
->setCorporationID($loopData['corporationID'])
->setCorporationName($loopData['corporationName']);
$this->sEntityManager->persist($oCharacters);
}
$this->sEntityManager->flush();
关键是,我们什么时候会有错误
$loopData
我们将退出当前函数。但是图像foreach中的第二项将为false,因此第一个实体将持久化到EntityNamager。我怎样才能把它弄出来?因为next(即使在另一个service\controller中)->flush()将保存它,而我们不需要它。您要的是显式事务。看一看这张照片。基本上,您的代码应该如下所示:
$this->sEntityManager->getConnection()->beginTransaction();
try {
foreach ($rwst as $row) {
$loopData = XmlFunctions::getXmlAttrAsArray($row);
if (!$loopData) {
throw new SomeException();
}
\\ the rest of your code
$this->sEntityManager->persist($oCharacters);
}
$this->sEntityManager->flush();
$this->sEntityManager->getConnection()->commit();
return true;
} catch (SomeException $e) {
$this->sEntityManager->getConnection()->rollback();
$this->sEntityManager->close();
}
return false;
和往常一样,我能想象的是,任何一件事都要简单得多=\
if(!$loopData)
{
$this->sEntityManager->clear()
return false;
}
所有持久化的实体都将与条令分离,因此它们不会被插入\更新。
或针对单个实体
$this->sEntityManager->detach($entity);
要撤消持久化调用吗?如果您真的想保存,您应该只调用persist。不是,您自己试试,正如我所说的,无论从哪个控制器调用flush(),它都会插入到db我们的实体中。作为一个简单的示例,尝试在一个服务中持久化,然后在另一个服务中调用flush,从第一个服务调用实体,将被插入EAH这是所需的行为,因此如果在多个服务中编辑多个实体,则不必刷新和查询数据库。这有什么不对?若你们想要一个新的实体,并且一定要将它保存到数据库中,你们应该只调用persist。。。如果一个实体已经存在,因此由条令管理。。。您甚至可以使用持久调用和调用flush来保存实体。很好的示例,但它是事务,我不需要它,反正我找到了答案