2013-08-20 42 views
0

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

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

+0

请看看你的代码,我敢打赌它可以从更好的格式中受益。 – hakre

+0

K ...将格式化得更好 – Rudra

+0

这是TestA还是TestB的控制器?作为输入输入的'$ id'是TestA或TestB的id还是两者都没有? – Pitchinnate

回答

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

这不起作用 – Rudra

+0

如果你希望我们尝试帮助你进行调试,你将不得不做更具描述性的描述。什么不起作用? – Pitchinnate

+0

这真的会起作用)。我无法理解你想要做什么。 – ineersa

0

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

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

我得到这个异常...... CDbCommand未能执行SQL语句:SQLSTATE [23000]:完整性约束违规:1062键'PRIMARY'的重复条目'5'。 – Rudra

+0

这是一个主键,不能更新 – Rudra

+0

您的数据库中已经有一行使用该ID,并且您想要插入一个新行(您正在代码的第3行创建新的模型B)。如果你想更新模型B,你应该首先加载模型,而不是创建一个新模型。 – davey

0

假设你是Model_A的控制器,并且您只更新Model_A(您正在进行更新操作)。

  • 首先负载模型甲
  • 填充模型A的属性与POST数据
  • 负载模型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, 
       )); 
     }