2

2 つのモデルを一度に更新するフォームを Yii で作成しています。
フォームは各モデルの入力を $modelA と $modelB として受け取り、ここで説明されているように個別に処理しますhttp://www.yiiframework.com/wiki/19/how-to-use-a-single-form-to- 2つ以上のモデルの収集データ/

これはすべて良いです。この例との違いは、$modelA (ドキュメント) を保存してその ID を取得する必要があり、次に $modelB を保存して、関連する $model A の ID を含める必要があることです。

$modelB には、保存する必要があるファイルがあるという追加のひねりがあります。

私のアクションコードは次のとおりです。

if(isset($_POST['Documents'], $_POST['DocumentVersions']))
    {
        $modelA->attributes=$_POST['Documents'];
        $modelB->attributes=$_POST['DocumentVersions'];


        $valid=$modelA->validate();
        $valid=$modelB->validate() && $valid;


        if($valid)
        {

            $modelA->save(false); // don't validate as we validated above.
            $newdoc = $modelA->primaryKey; // get the ID of the document just created

            $modelB->document_id = $newdoc;         // set the Document_id of the DocumentVersions to be $newdoc
            // todo: set the filename to some long hash

            $modelB->file=CUploadedFile::getInstance($modelB,'file');       
            // finish set filename
            $modelB->save(false);

            if($modelB->save()) {
                $modelB->file->saveAs(Yii::getPathOfAlias('webroot').'/uploads/'.$modelB->file);
                }

            $this->redirect(array('projects/myprojects','id'=>$_POST['project_id']));
        }
    }
    ELSE {

    $this->render('create',array(
        'modelA'=>$modelA,
        'modelB'=>$modelB,
        'parent'=>$id,
        'userid'=>$userid,
        'categories'=>$categoriesList
    ));
    }

「file」と「document_id」の新しい値を $modelB にプッシュしていることがわかります。これはすべて問題なく機能しますが、... これらの値の 1 つを $modelB にプッシュするたびに、$modelA の新しいインスタンスを取得するようです。その結果、3 つの新しいドキュメントと 1 つの新しいバージョンが得られます。新しいバージョンはすべて正しくリンクされていますが、他の 2 つのドキュメントはただの複製です。
私は $modelB の更新ステップを削除することをテストしましたが、確かに、削除されるたびに $modelA のコピー (または少なくとも結果のデータベース エントリ) が削除されます。
これを防ぐ方法がわかりません。

アップデート....

以下のコメントにあるように、さらなるテストでは、$modelA のインスタンス数は、フォームが送信された回数に依存することが示されています。その間、他のページ/ビューにアクセスしても、フォームが短期間に再送信されると、そのたびにデータベースに余分なエントリが追加されます。これがなんらかの永続性によるものである場合、現在のモデルの倍数ではなく、PREVIOUS モデルの余分なコピーを取得することを期待します。したがって、インクリメントしているカウンターがあるように、保存の途中で何かが疑われますが、これをどこで探すか、または毎回ゼロにする方法がわかりません。

いくつかの助けをいただければ幸いです。ありがとう

JMB

4

1 に答える 1

1

OK、Ajax検証をtrueに設定しました。これは、作成アクションを呼び出してエントリを挿入することでした。私はこれを完全には理解していません。または、この効果なしで本当に必要な場合にajax検証を使用する方法はわかりませんが、少なくとも、関係のある2つのモデル挿入は機能します。

コメントありがとうございます。JMBを応援します

于 2012-09-27T00:16:55.023 に答える