2010-06-10 11 views
5

Soy nuevo en cakephp. Quiero saber si es posible en cakephp manejar múltiples commits y reversiones de modelo con una sola transacción. que quiero hacer algo como estoGestión de transacciones con varios modelos que utilizan compromiso de transacción única y retrotracción

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

Respuesta

3

Sí, se puede.

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

También eche un vistazo a manual.

+0

Éste no funciona. Propiedad indefinida: MyController :: $ Modelo ¿Quiere decir Modelo - es solo algunas de las clases de modelo definidas para el controlador? Si es así, ¿se incluyen otras vistas en dicha transacción? –

+0

Cambie "Modelo" al nombre de su clase de modelo. No entendí tu pregunta sobre los puntos de vista. Si tiene un problema específico, abra una nueva pregunta. – bancer

3

Si sus modelos tienen 1-3 "tiene muchas" o "pertenece a" las relaciones, probablemente debería utilizar

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

Se hará cargo de la validación y el ahorro de todos los modelistas datos publicados en una sola transacción .

1

El método más preferible es Model :: saveAll(), si están relacionados.

Si no puede utilizar saveAll() becuase es necesario utilizar algo como Modelo :: query(), que puede hacer:

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

A partir de la torta 1.3, en realidad no importa qué modelo estás usando cuando ejecutas las instrucciones de inicio/confirmación/restitución; todos hacen que se ejecute el mismo código y no tienen efectos secundarios específicos del modelo.

Cuestiones relacionadas