我正在用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
));
}
您可以看到我将'file'和'document_id'的新值推送到$ modelB。这一切都没有问题,但是......每当我将其中一个值推入$ modelB时,我似乎得到了一个$ modelA的新实例。所以净结果,我得到3个新文件,1个新版本。新版本都正确链接,但其他两个文件只是直接重复 我已经测试了删除$ modelB更新步骤,果然,对于每个删除了一个$ modelA的副本被删除(或者至少是结果数据库条目)。 我不知道如何防止这种情况。
... UPDATE
在下面的评论中,进一步测试显示$ modelA的实例数取决于表单提交的次数。即使在此期间访问其他页面/视图,如果在短时间内重新提交表单,每次我在数据库中获得额外的条目。如果这是由于某种形式的持久性,那么我希望获得PREVIOUS模型的额外副本,而不是当前模型的倍数。所以我怀疑它的保存方式,就像有一些计数器正在递增,但我不知道在哪里寻找这个,或者每次如何将它归零。
非常感谢一些帮助。 感谢
JMB
答案 0 :(得分:1)
好的,我将Ajax验证设置为true。这是调用create动作并插入条目。我没有完全得到这个,或者如果我真的想要没有这种效果我怎么能使用ajax验证,但是......至少两个模型插入关系有效。
感谢您的评论。 干杯 JMB