Управление транзакциями с несколькими моделями с использованием фиксации и отката одной транзакции - PullRequest
5 голосов
/ 10 июня 2010

Я новичок в 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 ]

3 голосов
/ 15 марта 2011

Если ваши модели 1-3 имеют отношения "имеет много" или "принадлежит", вам, вероятно, следует использовать

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

Он позаботится о проверке и сохранении всех опубликованных данных модели в одной транзакции.

3 голосов
/ 11 июня 2010

Да, вы можете.

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

Также посмотрите руководство .

1 голос
/ 30 августа 2011

Наиболее предпочтительный метод - Model :: saveAll (), если они связаны между собой.

Если вы не можете использовать saveAll (), потому что вам нужно использовать что-то, например Model :: query (),вы можете сделать:

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

Начиная с Cake 1.3, на самом деле не имеет значения, какую модель вы используете, когда запускаете операторы begin / commit / rollback;все они вызывают выполнение одного и того же кода и не имеют побочных эффектов, характерных для модели.

...