【问题标题】:Saving data to Two db tables with two models inYii在Yii中将数据保存到两个具有两个模型的数据库表
【发布时间】:2014-08-31 01:49:17
【问题描述】:

我正在尝试将数据保存到 Yii 中具有两个不同模型的两个数据库表中。我已经查阅了 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,
    ));
}

我只需要将数据保存到表中,但视图中不需要“历史”表的数据。非常感谢任何帮助!有人向我提供了以下代码,但是,它不起作用:

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

}

【问题讨论】:

    标签: php mysql sql yii


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。这似乎是一个简单的修复,我研究过的参考资料提供的代码似乎可以做到,但我还没有找到错误。
    【解决方案2】:

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

    查看维基页面。

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

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

    【讨论】:

    • 感谢您的回复。这是第二个模型,需要更改吗?公共函数 actionCreate() { $model=new SalesRepMinMarginHistory; // 如果需要 AJAX 验证,请取消注释以下行 // $this->performAjaxValidation($model); if(isset($_POST['SalesRepMinMarginHistory'])) { $model->attributes=$_POST['SalesRepMinMarginHistory']; if($model->save()) $this->redirect(array('view','id'=>$model->id)); $this->render('create',array('model'=>$model, )); }
    【解决方案3】:

    首先使用模型将数据保存在第一个表中

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

    【讨论】:

    • 感谢您的回复。这是第二个模型,需要更改吗?公共函数 actionCreate() { $model=new SalesRepMinMarginHistory; // 如果需要 AJAX 验证,请取消注释以下行 // $this->performAjaxValidation($model); if(isset($_POST['SalesRepMinMarginHistory'])) { $model->attributes=$_POST['SalesRepMinMarginHistory']; if($model->save()) $this->redirect(array('view','id'=>$model->id)); $this->render('create',array('model'=>$model, )); }
    • 尝试了代码,但它不起作用。想知道我的 SQL 是否有问题,因为我在那里收到错误信息。在这里发布问题:stackoverflow.com/questions/24679010/…
    • actionCreate() 函数没问题。只需替换 - $model->save(false);
    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多