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

时间:2013-08-20 12:22:51

标签: 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;    
            $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

中的行

3 个答案:

答案 0 :(得分:2)

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

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,
    ));
}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

假设您在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,
                ));
        }