0

私は巨大なフォームを持っていて、フォームを5つの異なるテーブルに保存したいのですが、データが5つのテーブルすべてに保存されるようにしたいのです。このため、Yii Transationsを使用しようとしていますが、機能しません。以下のコードを見て、バグを見つけてください。

$ParentModel->attributes = $_POST['ParentModel'];
$firstChild->attributes = $_POST['FirstChild'];
$secondChild->attributes = $_POST['SecondChild'];
$thirdChild->attributes = $_POST['ThirdChild'];
$fourthChild->attributes = $_POST['FourthChild'];

if($ParentModel->validate())
{
    $transaction = $ParentModel->dbConnection->beginTransaction(); // Transaction begin
    try{
        $ParentModel->save(); // saving parent model

        //parent_id is required for all models

        $firstChild->parent_id = $ParentModel->id;
        $secondChild->parent_id = $ParentModel->id;
        $thirdChild->parent_id = $ParentModel->id;
        //$fourthChild->parent_id = $ParentModel->id; I commented this line so that fourth child throw an exception on $fourthChild->save() becuase parent_id is required


        $firstChild->save();    
        $secondChild->save();
        $thirdChild->save();
        $fourthChild->save(); // fourth child is not saved here, transction should throw exception

        $transaction->commit();    // committing 

        $this->redirect(array('view','id'=>$ParentModel->id));    // Redirecting on user creation
    }
    catch (Exception $e){
        $transaction->rollBack();
    }
}

上記のコードは例外をスローせず、検証ルールの失敗により4番目のテーブルのデータが失われます。

4

2 に答える 2

1

モデルに保存するときにYiiは例外をスローしません。

保存後に独自のエラーチェックを追加する必要があります。おそらく次のようなものです(テストされていません)。

if($ParentModel->validate())
{
    $transaction = $ParentModel->dbConnection->beginTransaction(); // Transaction begin
    try{
        $ParentModel->save(); // saving parent model

        //parent_id is required for all models

        $firstChild->parent_id = $ParentModel->id;
        $secondChild->parent_id = $ParentModel->id;
        $thirdChild->parent_id = $ParentModel->id;
        //$fourthChild->parent_id = $ParentModel->id; I commented this line so that fourth child throw an exception on $fourthChild->save() becuase parent_id is required

        $results = array()
        $results[] = $firstChild->save();    
        $results[] = $secondChild->save();
        $results[] = $thirdChild->save();
        $results[] = $fourthChild->save(); // fourth child is not saved here, transction should throw exception

        foreach($results as $result) {
           if (!$result) { throw new Exception('error') }
        }

        $transaction->commit();    // committing 

        $this->redirect(array('view','id'=>$ParentModel->id));    // Redirecting on user creation
    }
    catch (Exception $e){
        $transaction->rollBack();
    }
}
于 2012-11-09T01:28:08.577 に答える
0

上記のコードの5行目:

$fourthChild-->attributes = $_POST['FourthChild'];

そのはず

$fourthChild->attributes = $_POST['FourthChild'];
于 2012-11-08T21:10:42.063 に答える