【发布时间】:2012-09-26 11:01:59
【问题描述】:
我正在使用 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 副本都会被删除(或者至少是生成的数据库条目)。
我不知道如何防止这种情况。
更新....
正如我在下面的评论中所说,进一步的测试表明 $modelA 的实例数量取决于表单提交的次数。即使同时访问其他页面/视图,如果在短时间内重新提交表单,每次我都会在数据库中获得额外的条目。如果这是由于某种形式的持久性,那么我希望获得 PREVIOUS 模型的额外副本,而不是当前模型的倍数。所以我怀疑它的保存方式有什么问题,比如有一些计数器在增加,但我不知道在哪里寻找它,或者每次如何将它归零。
我们将不胜感激。 谢谢
JMB
【问题讨论】:
-
我正要发布同样的问题 :) 我正在浏览 yii 问题,看看是否有其他人发布了这个问题 :) 我遇到了完全相同的问题。模型 A 表单 + 模型 B 表单在同一个 _form.php 中,模型 B 需要模型 A 的 ID。我会查看您发布的链接,看看我是否可以解决我的问题并帮助您解决当前的问题。跨度>
-
我希望您得到两个
$modelB实例到$modelA之一,因为您保存了$modelB然后在 if 条件下再次执行此操作。但是我不明白为什么你会得到这个奇怪的结果($modelA的 3 个副本到$modelB的一个??你确定你在$modelB中没有afterSave方法吗?! -
好的,还有一些调试显示......模型B的实例数似乎是基于表单提交的数量,如果我一个接一个地继续添加更多文档,我会得到更多并且$modelA 的更多实例。模型在代码顶部重置,$modelA = new Documents 和 $modelB = new DocumentVersion。
-
嗨,我正在尝试为我自己的项目实现相同的想法,但我的代码没有通过 is($valid) 条件。我们是否需要在表单上插入任何排序或代码以允许将模型 A 的 id 插入模型 B?在您的代码中,这 $modelB->document_id = $newdoc;可以解决问题,但我仍然无法通过模型验证。在我的情况下,我正在尝试 3 个模型 ModelA、B 和 C,并且 A 的主键也应该转到 modelB 和 modelC。关于我缺少什么的任何想法?