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