2010-02-18 37 views
2

我正在將一些內容導入到嵌套樹模型中,並且我正在實現一個事務以確保每個對象都已保存;如果沒有,請將其從樹上移除。我正在使用Doctrine 1.1.6。在Doctrine中嵌套集回滾

// Start the transaction 
$conn = Doctrine_Manager::connection(); 
try { 
    $conn->beginTransaction(); 

    // add it as a child of the suburb 
    $object->getNode()->insertAsLastChildOf($parent); 
    ... 
    // save related objects 
    ... 
    $conn->commit(); 

} catch(Doctrine_Exception $e) { 
    $conn->rollback(); 
} 

發生了什麼事,現在是,如果在事務塊的所有錯誤,所有的對象都將被刪除。但是樹不會返回到原來的位置。這意味着,我將在'lft'和'rgt'位置留出空格。那時樹會被破壞;並且修復數千個結果的樹可能非常昂貴。

我該怎麼做才能回滾insertAsLastChildOf()。我認爲這是教義本身應該做的事情,但我希望有人能給我一個提示。

謝謝!

回答

1

我不得不做樹的手動回滾時,插入失敗,這是我使用的代碼:

try { 
    $conn->beginTransaction(); 

    // add it as a child of the suburb 
    $obj->getNode()->insertAsLastChildOf($parent); 
    $rgt = $obj->rgt; 
    ... 
    ... 
}catch(Doctrine_Exception $e) { 
    $conn->rollback(); 

    $result = Doctrine_Query::create()->update('Model p') 
    ->set('p.lft = p.lft - 2') 
    ->set('p.rgt = p.rgt - 2') 
    ->where('p.rgt > ?', $rgt) 
    ->addWhere('p.root_id = ?', $parent->root_id) 
    ->execute(); 
} 
0

而7年後的人(我)也有類似的問題。我在Doctrine documentation找到了答案。您只需在try之前放$conn->beginTransaction();,主義將回滾所有內容:

// $em instanceof EntityManager 
    $em->getConnection()->beginTransaction(); // suspend auto-commit 
    try { 
     $object->getNode()->insertAsLastChildOf($parent); 
     $em->flush(); 
     $em->getConnection()->commit(); 
    } catch(Doctrine_Exception $e) { 
     $em->getConnection()->rollBack(); 
    }