0

我们有

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();

关键是当我们将 FALSE on

$loopData

我们将退出当前函数。但。图像我们将在 foreach 中的第二个项目上设置错误,因此第一个实体将被持久化到 EntityNamager。我怎样才能把它弄出来?因为 next (甚至在另一个服务\控制器中) ->flush() 会保存它,我们不想要它。

4

2 回答 2

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;
于 2013-05-22T16:42:32.600 回答
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

于 2013-05-22T19:50:04.553 回答