2010-06-10 2 views
5

저는 cakephp를 처음 사용합니다. cakephp에서 단일 트랜잭션으로 다중 모델 커밋 및 롤백을 처리 할 수 ​​있는지 알고 싶습니다. 이런 일을하고 싶습니다.단일 트랜잭션 커밋 및 롤백을 사용하여 여러 모델로 트랜잭션 관리

<?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 :: $ Model 모델이란 컨트롤러 용으로 정의 된 모델 클래스의 일부입니까? 그렇다면 그러한 거래에 다른 견해가 포함되어 있습니까? –

+0

"모델"을 모델 클래스 이름으로 변경하십시오. 조회수에 대한 귀하의 질문을 이해하지 못했습니다. 특정 문제가있는 경우 새 질문을 엽니 다. – bancer

3

당신의 모델 1-3이있는 경우 또는 그것은 하나의 트랜잭션의 모든 게시 된 모델 데이터의 유효성을 검사 및 저장 처리됩니다 관계, 당신은 아마

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

을 사용한다 "많은있다" "에 속하는" .

1

가장 좋은 방법은 Model :: saveAll()과 관련된 경우입니다.

당신이 그런 모델로 뭔가 :: 쿼리()를 사용할 필요가 becuase 당신이 시려면()를 사용할 수없는 경우, 당신은 할 수 있습니다 :

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

케이크 1.3로, 실제로는 중요하지 않습니다 begin/commit/rollback 문을 실행할 때 사용하는 모델. 그것들은 모두 동일한 코드를 실행하게하고 모델에 특정한 부작용이 없습니다.