Symfony2,Doctrine2,EntityManager禁用上次操作

时间:2013-05-22 15:42:42

标签: loops symfony doctrine-orm entitymanager

我们有

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,因此第一个Entity将持久保存到EntityNamager。我怎么能把它拿出来?因为接下来(即使在另一个服务\控制器中) - > flush()将保存它,我们不希望它。

2 个答案:

答案 0 :(得分:0)

您正在寻找的是明确的交易。看看Doctrine-documentation。基本上你的代码应该是这样的:

$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;

答案 1 :(得分:0)

总是如我所能想象的那么简单。 = \

if(!$loopData)
{
    $this->sEntityManager->clear()
    return false;
}

所有持久化的实体都会脱离教条,因此不会插入\更新。 或单个实体

$this->sEntityManager->detach($entity);

http://doctrine-orm.readthedocs.org/en/2.0.x/reference/batch-processing.html