Activerecord Yii2更新相关模型进行插入

Activerecord Yii2更新相关模型进行插入,activerecord,yii2,Activerecord,Yii2,取决于此问题:。我已经设法将相关模型InvoiceItems调用到Invoices模型,它有许多关系 但是,更新会导致在invoice\u items表中插入新记录,而不是将当前相关记录更新到invoices表中 我试图在\u表单视图中添加每个InvoiceItems记录的id字段来解决此问题,但它仍然存在 以下是InvoicesController的actionUpdate: public function actionUpdate($id) { $model = $t

取决于此问题:。我已经设法将相关模型
InvoiceItems
调用到
Invoices
模型,它有许多关系

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

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

以下是
InvoicesController
actionUpdate

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,
            ]);
        }
    }
<div class="invoices-form">

    <?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'created')->textInput() ?>

    <?= $form->field($model, 'type')->textInput(['maxlength' => true]) ?>
  <hr />
  <?php if (is_array($invoiceItems)): ?>
  <?php foreach ($invoiceItems as $i => $item): ?>
  <?= $form->field($item, "[$i]id")->textInput();?>
    <?= $form->field($item, "[$i]item_id")->textInput();?>
    <?= $form->field($item, "[$i]unit_id")->textInput();?>
    <?= $form->field($item, "[$i]qty")->textInput();?>
  <?php  endforeach; ?>
  <?php  else: ?>
    <?= $form->field($invoiceItems, "item_id")->textInput();?>
    <?= $form->field($invoiceItems, "unit_id")->textInput();?>
    <?= $form->field($invoiceItems, "qty")->textInput();?>
  <?php endif; ?>    

    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

    <?php ActiveForm::end(); ?>

</div>
下面的屏幕截图直观地展示了我得到的:


我确信下面的代码当然会用提交的数据填充名为$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);
      }
}
但是所有$items都有一个场景“insert”(可以是您允许设置属性“ID”,但通常在Gii生成的代码中不允许这样做。然后,无论何时保存,您都会得到“newitems”

如果在loadMultiple之后添加一个
return var_dump($invoiceItems);
,您将看到只有
safe
属性被提交的数据填充

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);
      }
}
您在保存之前也没有验证它们,这也有点糟糕

 if (Model::loadMultiple($invoiceItems, Yii::$app->request->post()) && Model::validateMultiple($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();
    }
如果这是新的,请检查用户是否正确设置了相关字段,您可以使用这些字段保存它

$yourModel->save(); 
否则,您可以根据答案和答案简化discart..(不保存)

。我可以确定问题的解决方案

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

$count = count(Yii::$app->request->post('InvoiceItems', []));
        //Send at least one model to the form
        $invoiceItems = [new InvoiceItems()];
$invoiceItems
的值应使用如下关系获得:

$invoiceItems = $model->invoiceItems;

但是,在更新过程中,我在向相关模型添加新记录方面仍然存在另一个问题。

请查看我的答案,具体取决于您的答案。我已经更新了asnwer,并提供了一些新记录的建议。添加新记录有点复杂,因为在v中请求添加发票项查看..但在视图中通常不执行操作..您可以直接在视图中执行操作(不适合面向MVC)或者您可以通过ajax调用服务操作来获取所需的新模型。我认为最后一个错误可能会有所帮助。例如,我只需加载预定义的
InvoiceItems
进行更新,然后为新记录创建新的
InvoiceItems
模型。问题在于如何在视图中创建新的插入字段以及如何加载它们n控制器。