Php 如何从一个表单yii更新两个表

Php 如何从一个表单yii更新两个表,php,yii,Php,Yii,我必须从一张表格中更新两张表格。我有两张表TestA和TestB。 那么如何更新两个表,其中TestB.testid=TestA.testid。两个表都已填充。我需要根据TestA的id更新TestB。 下面是TestA的actionUpdate public function actionUpdate($id) { $model_A=new TestA; $model_B=new TestB;

我必须从一张表格中更新两张表格。我有两张表TestA和TestB。 那么如何更新两个表,其中
TestB.testid=TestA.testid
。两个表都已填充。我需要根据TestA的id更新TestB。 下面是TestA的
actionUpdate

  public function actionUpdate($id)
        {       $model_A=new TestA;    
                $model_B=new TestB;    
            $model=$this->loadModel($id);
            if(isset($_POST['TestA'])&&isset($_POST['TestB']))
            {
                 $model_A->attributes=$_POST['TestA'];                   
                 $model_B->attributes=$_POST['TestB'];

                 $model_B->name="test";              

                 $model_A->save();
                 $model_B->save();    
            $this->render('update',array(
                'model'=>$model,
            ));
        }  

当我运行应用程序时,会在TestB中创建一个新条目,而不是更新现有条目。如何传递id以更新表TestB中的行

保存后,您可以访问所有模型属性(包括id)。因此,在保存$model\u A之后,$model\u A->testid将包含刚刚保存的模型(model A)的testid


好的,如果这是更新,您需要首先从数据库中提取现有值,然后需要确保将两个模型都发送到表单:

public function actionUpdate($id) {
    $model_A = TestA::model()->findByPk($id);
    $model_B = TestB::model()->findByAttributes(array('testid'=>$model_A->testid));
    if (isset($_POST['TestA']) && isset($_POST['TestB'])) {
        $model_A->attributes = $_POST['TestA'];
        $model_B->attributes = $_POST['TestB'];

        $model_B->name = "test";

        $model_A->save();
        $model_B->save();
    }
    $this->render('update', array(
        'model_A' => $model_A,
        'model_B' => $model_B,
    ));
}

假设您在Model_A的控制器中,并且只更新Model_A(您在更新操作中)

  • 第一负荷模型A
  • 用POST数据填充模型A的属性
  • 加载模型B,如果不存在,则创建新模型B
  • 用POST数据填充模型B的属性
  • 保存模型A和模型B
虽然在这里使用关系更好(也更容易),并将整个模型B的内容放在模型A的afterSave方法中

 public function actionUpdate($id)
        {
            $model=$this->loadModel($id);

            if(isset($_POST['TestA'])&&isset($_POST['TestB']))
            {
                 $model->attributes=$_POST['TestA'];

                 $modelB = TestB::model()->findByAttributes(array('testid'=>$model->testid));

                 if ($modelB == null) {
                   $modelB = new TestB;
                   $modelB->testid = $model->testid;
                 }

                 $model_B->attributes=$_POST['TestB'];


                 if ($model_A->save()) {
                    $model_B->save();
                 }

                $this->render('update',array(
                    'model'=>$model,
                ));
        }

请看一看你的代码,我打赌它可以从更好的格式中获益。K…将更好地格式化它这是TestA或TestB的控制器还是两者都不是?作为输入输入的
$id
是TestA或TestB的id还是两者都不是?@我已经提到过它是测试中的一个控制器\u AI得到了这个异常…CDbCommand无法执行SQL语句:SQLSTATE[23000]:完整性约束冲突:1062键“PRIMARY”的重复条目“5”。数据库中已有一行具有该id,您希望插入新行(您正在代码第3行创建新的模型B)。如果你想更新模型B,你应该先加载该模型,而不是创建一个新模型。你能解释一下我是新手吗?如果你想让我们帮助你调试,你必须更具描述性。什么不起作用?嗯,这会起作用的)。我不明白您想做什么。TestA和TestB的行是否已经存在?您是同时更新这两个测试还是更新TestA并创建新的TestB?你的观点是什么?你得到了什么错误?绝对工作正常…我把$model\u B->testid=$model\u A->testid;它给了我一个例外,但testA的更新形式中的字段并没有填充这个值。Gridview正在填充。我可以为此做些什么
 public function actionUpdate($id)
        {
            $model=$this->loadModel($id);

            if(isset($_POST['TestA'])&&isset($_POST['TestB']))
            {
                 $model->attributes=$_POST['TestA'];

                 $modelB = TestB::model()->findByAttributes(array('testid'=>$model->testid));

                 if ($modelB == null) {
                   $modelB = new TestB;
                   $modelB->testid = $model->testid;
                 }

                 $model_B->attributes=$_POST['TestB'];


                 if ($model_A->save()) {
                    $model_B->save();
                 }

                $this->render('update',array(
                    'model'=>$model,
                ));
        }