2010-02-18 2 views
2

Я импортирую некоторый контент в модель Nested Tree, и я реализую транзакцию, чтобы убедиться, что каждый объект был сохранен; а если нет, удалите его из дерева. Я использую 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. Вам просто нужно поставить $conn->beginTransaction(); до try, и Доктрина откажется от всего:

// $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(); 
    } 
Смежные вопросы