我正在用Yii構建一次更新兩個模型的表單。
表單將每個模型的輸入視爲$ modelA和$ modelB,然後分別按照此處所述處理它們http://www.yiiframework.com/wiki/19/how-to-use-a-single-form-to-collect-data-for-two-or-more-models/提交後處理表單輸入值導致多個實例
這樣很好。與我的例子不同的是,$ 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
));
}
你可以看到,我推新值「文件」和「DOCUMENT_ID」到$ modelB。這一切工作沒有問題,但是...每次我將這些值中的一個推入$ modelB中,我似乎獲得了$ modelA的新實例。所以最終的結果是,我得到了3個新文檔和1個新版本。新版本全部正確鏈接,但其他兩個文檔只是直接複製。
我已經測試刪除了$ modelB更新步驟,並且確實已經刪除了$ modelA的副本(或者至少是生成的數據庫條目)。
我不知道如何防止這種情況。
UPDATE ....
當我把在下面留言,進一步測試顯示$ MODELA的實例的數量取決於有多少次的表格已經提交。即使在此期間訪問了其他頁面/視圖,如果表單在短時間內重新提交,每次我在數據庫中獲得一個額外的條目。如果這是由於某種形式的持久性,那麼我希望得到PREVIOUS模型的額外副本,而不是當前模型的倍數。所以我懷疑它的儲蓄方式是什麼,就像有一些計數器正在遞增一樣,但我不知道在哪裏尋找它,或者每次如何清零。
一些幫助將不勝感激。 感謝
JMB
我正要發佈相同的問題:)我正在瀏覽yii的問題,看看是否有人發佈了這個:)我有完全相同的問題。在同一個_form.php和模型B中的模型A +模型B表單需要模型A中的ID。我將看看您發佈的鏈接,看看是否可以解決我的問題並幫助解決當前的問題。 – WebDevPT
我希望你從'$ modelB'中保存'$ modelB',然後在if條件中再次執行'$ modelB'中的兩個'$ modelB'實例。但是我不明白你爲什麼會得到這個奇怪的結果('modelA'的3個拷貝到'$ modelB'中的一個??你確定''modelB''中沒有'afterSave'方法! – Nimir
好的,更多的調試顯示......模型B的實例數似乎基於表單提交的數量,如果我一個接一個地添加更多的文檔,我會得到越來越多的$ modelA實例。模型在$ modelA = new Documents和$ modelB = new DocumentVersion的代碼頂部被重置。 –