2010-06-10 5 views
5

Ich bin neu bei CakePHP. Ich möchte wissen, ob es in CakePHP möglich ist, mehrere Commits und Rollbacks mit einer einzigen Transaktion zu bearbeiten. Ich mag etwas, etwas zu tun wie dieseTransaktionsverwaltung mit mehreren Modellen mit Einzeltransaktions-Commit und Rollback

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

Antwort

3

Ja, Sie können.

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

Werfen Sie auch einen Blick auf die manual.

+0

Dieser funktioniert nicht. Undefinierte Eigenschaft: MyController :: $ Model Meinst du Model - sind nur einige der Modell-Klassen für Controller definiert? Wenn ja - sind andere Ansichten in einer solchen Transaktion enthalten? –

+0

Ändern Sie "Model" in Ihren Modellklassennamen. Ich habe deine Frage zu den Ansichten nicht verstanden. Wenn Sie ein bestimmtes Problem haben, öffnen Sie eine neue Frage. – bancer

3

Wenn Ihre Modelle 1-3 haben „hat viele“ oder „gehört“ Beziehungen, werden Sie wahrscheinlich

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

Es dauert kümmert sich um die Validierung und Speichern Sie alle aufgestellten Modell-Daten in einer einzigen Transaktion verwendet werden soll .

1

Die am meisten bevorzugte Methode ist Model :: saveAll(), wenn sie verwandt sind.

Wenn Sie nicht SaveAll verwenden können() weil Sie etwas wie Modell :: query() verwenden müssen, können Sie tun:

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

Wie Cake 1.3, ist es nicht eigentlich Sache Welches Modell verwenden Sie, wenn Sie die Anweisungen begin/commit/rollback ausführen; Sie bewirken, dass derselbe Code ausgeführt wird, und haben keine modellspezifischen Nebenwirkungen.