Yii2 при обновлении двух связанных моделей не показывает данные второй

У меня есть две связанные модели в отношении hasToMany. Первый Invoices, а второй InvoiceItems. В качестве прототипа процесса я пытаюсь соединить две модели через update представление InvoicesController, используя следующий код в actionUpdate из InvoicesController:

...
use common\models\Invoices;
use common\models\InvoicesSearch;
use common\models\InvoiceItems;
...

public function actionUpdate($id)
    {
        $model = $this->findModel($id);
        $invoiceItems = new InvoiceItems();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            $invoiceItems->invoice_id = $model->id;
            if ($invoiceItems->load(Yii::$app->request->post()) && $invoiceItems->save()){
              return $this->redirect(['view', 'id' => $model->id]);
            }
            else{
              // return false;
            }
        } else {
          $invoiceItems->invoice_id = $model->id;
            return $this->render('update', [
                'model' => $model,
                'invoiceItems' => $invoiceItems,
            ]);
        }
    }

В представлении update следующее:

<div class="invoices-update">
    <h1><?= Html::encode($this->title) ?></h1>
    <?= $this->render('_form', [
        'model' => $model,
        'invoiceItems' => $invoiceItems,
    ]) ?>
</div>

Наконец, следующее в представлении _form:

<div class="invoices-form">
    <?php $form = ActiveForm::begin(); ?>
    <?= $form->field($model, 'created')->textInput() ?>
    <?= $form->field($model, 'type')->textInput(['maxlength' => true]) ?>
  <hr />
    <?= $form->field($invoiceItems, 'item_id')->textInput();?>
    <?= $form->field($invoiceItems, 'unit_id')->textInput();?>
    <?= $form->field($invoiceItems, 'qty')->textInput();?>    

    <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>

Приведенный выше код успешно сохранил данные в таблице invoice_items. Однако в форме просмотра обновления есть пустые поля для модели InvoiceItems. т.е. item_id, unit_id и qty пусты в форме обновления после сохранения.

Примечание. Это первоначальный код, т.е. я буду работать позже, чтобы иметь возможность добавлять много элементов в счет, но сейчас я просто пытаюсь, чтобы один элемент был связан со счетом.


person SaidbakR    schedule 17.01.2016    source источник


Ответы (1)


Кажется, что представление обновления пусто, потому что вы визуализируете и пустые InvoceItmes..

 $invoiceItems = new InvoiceItems();

вы визуализируете представление обновления в другом разделе, и в этом разделе опубликованное значение не загружается

    $model = $this->findModel($id);
    $invoiceItems = new InvoiceItems();

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        $invoiceItems->invoice_id = $model->id;
        if ($invoiceItems->load(Yii::$app->request->post()) && $invoiceItems->save()){
          return $this->redirect(['view', 'id' => $model->id]);
        }
        else{
          // return false;
        }
    } else {//****** here the $invoceItems is empty (It has just been created) ***
      //$invoiceItems->invoice_id = $model->id;
      $invoceItems= findInvoceItmesModel($model->id);
        return $this->render('update', [
            'model' => $model,
            'invoiceItems' => $invoiceItems,
        ]);
    }

для заполнения данных для $invoceItems вам нужно что-то вроде

protected function findInvoiceItemsModel($id)
{
    if (($model = InvociceItems::findOne($id)) !== null) {
        return $model;
    } else {
        throw new NotFoundHttpException('The requested page does not exist.');
    }
}

Очевидно, это для одной модели. Вы должны реорганизовать более одной модели.

person scaisEdge    schedule 17.01.2016
comment
Что ж! Что я мог сделать, чтобы заполнить его данными? - person SaidbakR; 17.01.2016
comment
При попытке $invoiceItems = $model->getInvoiceItems(); выдает ошибку: Calling unknown method: common\models\InvoiceItemsQuery::formName() - person SaidbakR; 17.01.2016
comment
Большое спасибо. Не могли бы вы подсказать мне, если мне нужно найти все позиции счета-фактуры. Я пытался использовать findAll вместо findOne, но он возвращает ошибку: Call to a member function formName() on array - person SaidbakR; 17.01.2016
comment
FindAll прав, но помните, что результатом является набор моделей, а не одна модель. затем для доступа к каждой модели вам нужна или итерация или индекс.. - person scaisEdge; 17.01.2016
comment
Очень полезно, я хотел бы упомянуть, что в представлении должен быть цикл, т.е. _form - person SaidbakR; 17.01.2016