2

我正在用 Yii 构建一个表单,它可以一次更新两个模型。
该表单将每个模型的输入作为 $modelA 和 $modelB ,然后按照此处所述分别处理它们http://www.yiiframework.com/wiki/19/how-to-use-a-single-form-to-为两个或更多模型收集数据/

这一切都很好。我对示例的不同之处在于,必须保存 $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 模型的额外副本,而不是当前模型的倍数。所以我怀疑它的保存方式有什么问题,比如有一些计数器在增加,但我不知道在哪里寻找这个,或者每次如何将它归零。

一些帮助将不胜感激。谢谢

捷豹路虎

4

1 回答 1

1

好的,我将 Ajax 验证设置为 true。这是调用创建操作并插入条目。我没有完全明白这一点,或者如果我真的想要没有这种效果,我怎么能使用 ajax 验证,但是......至少两个具有关系的模型插入是有效的。

感谢您的评论。欢呼 JMB

于 2012-09-27T00:16:55.023 回答