2

コントローラーでトランザクションを開始し、互いに関係のない複数のモデルを保存するにはどうすればよいですか? 何かが失敗した場合は、明らかにロールバックしたいと思います。すべてが機能した場合はコミットします。

私の質問は、どのモデルで取引を開始するかということだと思います。

$datasource = $this->Car->getDataSource();
$datasource->begin($this->Car);

$car = $this->Car->save();
$dog = $this->Dog->save();
$house = $this->House->save();

if ($car && $dog && $house) {
    $datasource->commit($this->Car);
} else {
    $datasource->rollback($this->Car);
}

これは、犬と家だけでなく車も確実に救うために機能しますか? つまり、トランザクションがどのモデルで開始されるかは重要ですか?

4

1 に答える 1

6

トランザクションを開始するためにどのモデルを使用するかは問題ではありませんが、一般的に、コントローラーに「最も近い」モデルがあればそれを使用します。

$continue = true;
$this->Car->begin();

// Do stuff that might set $continue to false.

if ($continue) {
    $this->Car->commit();
} else {
    $this->Car->rollback();
}

「Do stuff」ビット中に $continue を設定するには、各保存などを確認します。

if (!$this->Car->save()) {
    $continue = false;
}

if ($continue) {
    if (!$this->Dog->save()) {
        $continue = false;
    }
}

if ($continue) {
    if (!$this->House->save()) {
        $continue = false;
    }
}
于 2012-09-04T12:05:51.213 に答える