2014-12-16 7 views
5

मुझे पता है कि Zend फ्रेमवर्कMagento एकल में एकाधिक डेटाबेस लेनदेन प्रतिबद्ध

$db->beginTransaction(); 

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

में यह करने के लिए लेकिन मैं इसे Magento मॉडल का उपयोग करना चाहते हैं, जैसे

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

कुछ अगर उनमें से किसी को भी विफल रहा है तो बचाने के लिए सभी वापस लुढ़का किया जाना चाहिए

धन्यवाद

उत्तर

5

एप्लिकेशन/कोड/कोर/दाना/कोर/मॉड पर देखो एल/संसाधन/Transaction.php

यह मॉडल लेनदेन में वस्तुओं के रूप में एक और मॉडल जोड़ने की अनुमति देता है। सहेजने के दौरान इसे प्रत्येक जोड़ा ऑब्जेक्ट के लिए $object->save() पर कॉल करें। अगर कुछ विफल हो जाता है, तो यह प्रत्येक ऑब्जेक्ट के लिए $object->getResource()->rollBack() पर कॉल करता है। आप addCommitCallback(array($object, 'callbackFunctionName')) के माध्यम से प्रतिबद्ध कॉलबैक भी जोड़ सकते हैं।

आप लेन-देन को नष्ट की जरूरत है, $transaction->delete() बजाय $transaction->save() फोन इस मामले में यह $object->delete() बजाय $object->save() फोन प्रत्येक वस्तु के लिए।

उदाहरण:

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

धन्यवाद ToxaBse, क्या आप यह भी बता सकते हैं कि मैं 'modulename/table1' को सहेजना चाहता हूं और 'modulename/table2' अपडेट करना चाहता हूं और 'modulename/table3' को हटा दूं, मैं इसे कैसे प्राप्त करूं? – Ahmed

+0

मैंने एक लेनदेन में कार्यों को सहेजने और हटाने का उपयोग नहीं किया, लेकिन अगली पंक्ति जोड़ने की कोशिश करें: $ लेनदेन-> addCommitCallback (सरणी (Mage :: getModel ('modulename/table2'), 'delete');); – ToxaBes

1

सम्मिलित करें के लिए, हटाने और एक एकल लेनदेन में अद्यतन (अपनी टिप्पणी के अनुसार) नीचे की कोशिश,

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

मैं इस परीक्षण नहीं किया था। बस अपने जोखिम से कोशिश करें। समस्या यह है कि आप इसमें सभी डीबी-लेनदेन के लिए अंतिम डालने आईडी नहीं प्राप्त कर सकते हैं। delete() को save() पर कॉल करने की आवश्यकता नहीं है। लेकिन INSERT और UPDATE विधि को आपको save() पर कॉल करने की आवश्यकता है। परिणाम अपडेट करें यह काम कर रहा है या नहीं।

+0

यह मेरे लिए काम नहीं करता है। Http://stackoverflow.com/questions/13478840/how-to-save-and-delete-in-same-transaction पर एक समान प्रश्न के लिए @benmarks से एक समान (लेकिन सफल) उत्तर है –

संबंधित मुद्दे