2010-06-10 18 views
5

का उपयोग कर कई मॉडलों के साथ लेनदेन प्रबंधन मैं केकफ़्पी के लिए नया हूं। मैं जानना चाहता हूं कि केकफ़्पी में एकाधिक मॉडल प्रतिबद्धता और एकल लेनदेन के साथ रोलबैक को संभालना संभव है या नहीं। मैं इसएकल लेनदेन प्रतिबद्धता और रोलबैक

<?php 
function add(){ 
    $transaction = begintransaction; 
    if(model1->save()){ 
     if(model2->save()){ 
      if(model3->save(){ 
      } 
      else{ 
       $errorFlag['model3'] = "Error in model 3"; 
      } 
     } 
     else{ 
      $errorFlag['model2'] = "Error in model 2"; 
     } 
    } 
    else{ 
     $errorFlag['model3'] = "Error in model 3"; 
    } 
    if(empty($errorFlag)){ //no error in saving the model 
     $transaction->commit(); 
     $this->Session->setFlash(__('The form data with multiple model is saved', true)); 
    } 
    else{ //error in saving the model 
     $transaction->rollback(); 
     $this->Session->setFlash(__('The form data with multiple model is saved', true)); 
    } 
} 
?> 

उत्तर

3

हाँ, आप कर सकते हैं जैसे कुछ बात करना चाहता हूँ।

$this->Model->begin(); // Start transaction 
$this->Model->commit(); // Commit transaction 
$this->Model->rollback(); // Rollback transaction 

manual पर भी एक नज़र डालें।

+0

यह कोई काम नहीं करता है। अपरिभाषित संपत्ति: MyController :: $ मॉडल क्या आपका मतलब मॉडल - नियंत्रक के लिए परिभाषित मॉडल वर्गों में से कुछ है? यदि हां - तो ऐसे लेनदेन में अन्य विचार शामिल हैं? –

+0

अपने मॉडल वर्ग के नाम पर "मॉडल" बदलें। मुझे विचारों के बारे में आपका प्रश्न समझ में नहीं आया। यदि आपके पास कोई विशिष्ट समस्या है तो एक नया प्रश्न खोलें। – bancer

3

यदि आपका मॉडल 1-3 है "कई गया है" या रिश्ते, तो आप शायद

$this->Model1->saveAll($this->data); 

का उपयोग करना चाहिए यह एक एकल लेनदेन में मान्य और सभी तैनात मॉडल डेटा की बचत का ख्याल रखेंगे "के अंतर्गत आता है" ।

1

सबसे पसंदीदा तरीका मॉडल :: saveAll(), यदि वे संबंधित हैं।

आप saveAll() का उपयोग नहीं कर सकते क्योंकि आप इस तरह के मॉडल के रूप में कुछ :: क्वेरी() का उपयोग करने की जरूरत है, तो आप कर सकते हैं:

$this->ModelX->begin(); 
$this->Model1->query(); 
$this->Model2->query(); 
$this->ModelX->commit(); 

केक 1.3 के रूप में, यह वास्तव में बात नहीं करता है जब आप प्रारंभ/प्रतिबद्ध/रोलबैक स्टेटमेंट चलाते हैं तो आप किस मॉडल का उपयोग कर रहे हैं; वे सभी एक ही कोड को निष्पादित करने का कारण बनते हैं और उनके पास कोई मॉडल-विशिष्ट साइड इफेक्ट नहीं होता है।

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