2014-12-16 6 views
5

wiem, jak to zrobić w Zend FrameworkMagento transakcje wielokrotne bazy danych w pojedynczym popełnić

$db->beginTransaction(); 

try { 
    $db->query(...); 
    $db->query(...); 
    $db->query(...); 
    . 
    . 
    . 
    $db->commit(); 
} catch (Exception $e) { 
    $db->rollBack(); 
} 

ale chcę zrobić to za pomocą modelu Magento, coś

$db->beginTransaction(); 

try { 
    $modelOne = Mage::getModel('modulename/table1'); 
    $modelTwo = Mage::getModel('modulename/table2'); 
    $modelThree = Mage::getModel('modulename/table3'); 

    $db->query($modelOne); 
    $db->query($modelTwo); 
    $db->query($modelThree); 
    . 
    . 
    . 
    $db->commit(); 
} catch (Exception $e) { 
    $db->rollBack(); 
} 

Jeśli ktoś z nich nie aby zapisać to wszystko powinno być wycofana

Dzięki

Odpowiedz

5

Spójrz na app/code/core/Mage/rdzeń/Mod el/Resource/Transaction.php

Ten model pozwala dodać kolejne modele jako obiekty w transakcji. Podczas zapisywania wywołaj numer $object->save() dla każdego dodanego obiektu. Jeśli coś się nie powiedzie, zadzwoń pod numer $object->getResource()->rollBack() dla każdego obiektu. Możesz także dodać wywołania zwrotne commit przez addCommitCallback(array($object, 'callbackFunctionName')).

Jeśli trzeba usunąć transakcję, zadzwoń $transaction->delete() zamiast $transaction->save() W tym przypadku nazywamy $object->delete() zamiast $object->save() dla każdego obiektu.

Przykład:

try { 
    $transaction = Mage::getModel('core/resource_transaction') 
          ->addObject(Mage::getModel('modulename/table1')) 
          ->addObject(Mage::getModel('modulename/table2')) 
          ->addObject(Mage::getModel('modulename/table3')); 

    $transaction->save(); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} 
+0

Dziękuję ToxaBse, czy możesz także powiedzieć, co jeśli chcę zapisać "nazwa_modułu/table1" i zaktualizować "nazwę_modułu/tabeli2" i usunąć "nazwę_modułu/tabeli3", w jaki sposób mogę to osiągnąć? – Ahmed

+0

Nie użyłem akcji składowania i usuwania w jednej transakcji, ale spróbuj dodać następną linię: $ transaction-> addCommitCallback (array (Mage :: getModel ('nazwa_modułu/table2'), 'delete')); – ToxaBes

1

Dla INSERT, DELETE i UPDATE w pojedynczej transakcji (zgodnie z komentarza) Linki poniżej

<?php 

$id1 = 1; //update id 
$id2 = 2; //delete id 
$data = array('title'=>'New Title','content'=>'Hello, there..!','status'=>1); 
$update = array('title'=>'My title', 'content'=>'Hi, there..!', 'status'=>1); 

try { 
    $transaction = Mage::getModel('core/resource_transaction') 
          ->addObject(Mage::getModel('modulename/table1')->load($id1)->addData($update)); 
          ->addObject(Mage::getModel('modulename/table2')->setId($id2)->delete()); 
          ->addObject(Mage::getModel('modulename/table3')->setData($data)); 

    $transaction->save(); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} 

nie przetestowane. Po prostu spróbuj na własne ryzyko. Problem polega na tym, że nie można uzyskać ostatniego identyfikatora wkładki dla wszystkich transakcji DB w tym. delete() nie wymaga wywoływania save(). Ale metoda INSERT i UPDATE musisz ostatecznie zadzwonić pod numer save(). Proszę zaktualizować wynik, czy działa, czy nie.

+0

Ten nie zadziałał dla mnie. Istnieje podobna (ale udana) odpowiedź od @benmarks do podobnego pytania na http://stackoverflow.com/questions/13478840/how-to-save-and-delete-in-same-transaction –

Powiązane problemy