将数据保存到具有两个模型的两个db表中


Saving data to Two db tables with two models inYii

我试图将数据保存到Yii中具有两种不同模型的两个db表。我已经咨询了wiki: http://www.yiiframework.com/wiki/19/how-to-use-a-single-form-to-collect-data-for-two-or-more-models/和http://www.yiiframework.com/forum/index.php/topic/52109-save-data-with-two-models/,但我仍然不能得到数据保存到两个表。我有两个表sales_rep_min_marginsales_rep_min_margin_history:

CREATE TABLE `sales_rep_min_margin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL,
`domestic` int(2) NOT NULL,
`overseas` int(2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​​​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-

历史表:

  CREATE TABLE `sales_rep_min_margin_history` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `min_margin_id` int(11) NOT NULL,
    `from` int(11) DEFAULT NULL,
    `to` int(11) DEFAULT NULL,
    `update_username` varchar(32) NOT NULL,
    `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `min_margin_id` (`min_margin_id`),
    CONSTRAINT `sales_rep_min_margin_history_ibfk_1` FOREIGN KEY (`min_margin_id`) REFERENCES `sales_rep_min_margin` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
My SalesRepMinMarginController code (right now) is: 
public function actionCreate() {
        $model = new SalesRepMinMargin;
        $model2 = new SalesRepMinMarginHistory;
        //Uncomment the following line if AJAX validation is needed
        //$this->performAjaxValidation($model);
        if (isset($_POST['SalesRepMinMargin'])) {
            $model->attributes = $_POST['SalesRepMinMargin'];
            if ($model->save())
                $this->redirect(array('view', 'id' => $model->id));
        }
        if (isset($_POST['SalesRepMinMarginHistory'])) {
            $model2->attributes = $_POST['SalesRepMinMarginHistory'];
            $model2->save();
            $this->render('create', array(
                'model' => $model,
            ));
        }
    }
and 'SalesRepMinMarginHistoryController':
public function actionUpdate($id)
{
    $model=$this->loadModel($id);
    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);
    if(isset($_POST['SalesRepMinMarginHistory']))
    {
        $model->attributes=$_POST['SalesRepMinMarginHistory'];
        if($model->save())
            $this->redirect(array('view','id'=>$model->id));
    }
    $this->render('update',array(
        'model'=>$model,
    ));
}

我只需要将数据保存到表中,但我不需要视图中'history'表的数据。任何帮助是非常感谢!有人给了我下面的代码,但是,它不起作用:

public function actionCreate() {
    $model = new SalesRepMinMargin;
    $model2 = new SalesRepMinMarginHistory;
    //Uncomment the following line if AJAX validation is needed
    //$this->performAjaxValidation($model);
    if (isset($_POST['SalesRepMinMargin'])) {
        $model->attributes = $_POST['SalesRepMinMargin'];
        if ($model->save()) {
            if (isset($_POST['SalesRepMinMarginHistory'])) {
                $model2->attributes = $_POST['SalesRepMinMarginHistory'];
                $model2->save();
            }
            $this->redirect(array('view', 'id' => $model->id));
        }
    }
    $this->render('create', array(
        'model' => $model, 'model2' => $model2,
        ));
}

首先使用模型

在第一个表中保存数据
$model = new SalesRepMinMargin;
$model->attributes = $_POST['SalesRepMinMargin'];
if($model->save(false)) {
    /* use second model */
    $model2 = new SalesRepMinMarginHistory;
    $model2->attributes = $_POST['SalesRepMinMarginHistory'];
    $model2->save();
    $this->redirect(array('view', 'id' => $model->id));
}

第二个模型的保存函数不受影响,因为在保存第一个模型后会调用重定向函数。

查看wiki页面。

if($valid)
{
    // use false parameter to disable validation
    $a->save(false);
    $b->save(false);
    // ...redirect to another page
}

应该在成功保存两个模型后调用重定向函数

我不是专家,但也许您可以创建一个触发器来实现更改?当您在sales_rep_min_margin表中获得一个新表时,您也可以将数据转储到sales_rep_min_margin_history表中。