Yii2更新相关模型进行插入

时间:2016-01-18 14:56:37

标签: activerecord yii2

取决于这个问题:Yii2 updating two related models does not show data of the second。我已经将相关模型InvoiceItems调用到它有多种关系的Invoices模型。

但是,更新会导致在invoice_items表中插入新记录,而不是将当前相关记录更新到invoices表。

我尝试在id视图中添加每个InvoiceItems记录的_form字段来解决此问题,但它仍然存在。

以下是actionUpdate的{​​{1}}:

InvoicesController

这是public function actionUpdate($id) { $model = $this->findModel($id); //$invoiceItems = new InvoiceItems(); $count = count(Yii::$app->request->post('InvoiceItems', [])); //Send at least one model to the form $invoiceItems = [new InvoiceItems()]; //Create an array of the products submitted for($i = 1; $i < $count; $i++) { $invoiceItems[] = new InvoiceItems(); } if ($model->load(Yii::$app->request->post()) && $model->save()) { //$invoiceItems->invoice_id = $model->id; if (Model::loadMultiple($invoiceItems, Yii::$app->request->post())){ foreach ($invoiceItems as $item){ $item->invoice_id = $model->id; //$item->id = $model->invoiceItems->id; $item->save(false); } return $this->redirect(['view', 'id' => $model->id]); } else{ return var_dump($invoiceItems); } } else { //$invoiceItems->invoice_id = $model->id; $invoiceItems = $this->findInvoiceItemsModel($model->id); return $this->render('update', [ 'model' => $model, 'invoiceItems' => $invoiceItems, ]); } } 的{​​{1}}视图代码:

_form

以下屏幕截图,直观地展示了我的所作所为:

enter image description here

3 个答案:

答案 0 :(得分:1)

如果您在更新时不需要新记录,则应删除

这部分

    $count = count(Yii::$app->request->post('InvoiceItems', []));
    //Send at least one model to the form
    $invoiceItems = [new InvoiceItems()];

    //Create an array of the products submitted
    for($i = 1; $i < $count; $i++) {
        $invoiceItems[] = new InvoiceItems();
    }

以这种方式创建的$ invoiceItems是显而易见的"new",然后插入..对于更新,模型必须不是新的.. 你已经有相关的模型来保存它们来自post ..和来自加载多个

如果您需要管理新模型(例如:因为您在宽格式更新操作中添加了新记录),您可以测试

$yourModel->isNewRecord

如果这是新的检查,那么如果用户已正确设置相关字段,您可以使用

保存它
$yourModel->save(); 

否则你可以简单地放弃..(不保存)

答案 1 :(得分:0)

我很确定下面这段代码当然会用提交的数据填充一个名为$ invoiceItems的数组。

if (Model::loadMultiple($invoiceItems, Yii::$app->request->post())){
      foreach ($invoiceItems as $item){
        $item->invoice_id = $model->id;
        //$item->id = $model->invoiceItems->id;
        $item->save(false);
      }
}

但是所有$项目都有“插入”方案(可能是你允许设置属性'ID',但通常在Gii生成的代码中不允许这样做。然后你得到“新项目”保存。

如果您在loadMultiple之后添加return var_dump($invoiceItems);,则会看到只有safe属性填充了提交的数据。

在保存之前你也没有验证它们,这也很糟糕。

 if (Model::loadMultiple($invoiceItems, Yii::$app->request->post()) && Model::validateMultiple($invoiceItems)) {

http://www.yiiframework.com/doc-2.0/guide-input-tabular-input.html

答案 2 :(得分:0)

根据scaisEdge回答和this widget documentation。我能够确定问题解决方案。

简单地说,在我的代码中,当我说:

时,我忽略了两个模型之间的关系
$count = count(Yii::$app->request->post('InvoiceItems', []));
        //Send at least one model to the form
        $invoiceItems = [new InvoiceItems()];

$invoiceItems的值应使用如下关系获得:

$invoiceItems = $model->invoiceItems;

但是,在更新期间,我仍然有另一个问题,即在相关模型InvoiceItems中添加新记录。