2013-05-22 2 views
0

우리는Symfony2, Doctrine2, 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 

에 FALSE있을 때 우리가 현재 함수를 종료하는 것입니다이 비활성화합니다. 그러나. 이미지 foreach의 두 번째 항목에서 false가되므로 첫 번째 엔터티는 EntityNamager에 유지됩니다. 나는 어떻게 그것을 밖으로 얻을 수 있습니까? next (다른 서비스 \ 컨트롤러에서도) -> flush()가 그것을 저장하기 때문에 우리는 원하지 않습니다.

+0

하시나요? 당신은 정말로 컨트롤러를 flush()가 호출 될 것이라고 말했듯이, 실제로는 – nifr

+0

을 저장하지 않으려 고 할 때만 persist를 호출해야합니다. 이것은 db 엔터티에 삽입 될 것입니다. – user1954544

+0

간단한 예제로 하나의 서비스에서 유지하고 다른 하나의 엔티티에서 첫 번째 엔티티 플러시를 호출하려고하면 – user1954544

답변

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; 
+0

좋은 예이지만 거래이며, 나는 atm을 필요로하지 않는다. 어쨌든 나는 내 대답을 발견했다. – user1954544

관련 문제