Arhn - архитектура программирования

Модель, связанная с обновлением Yii2, делает вставку

В зависимости от этого вопроса: Yii2 обновляет два связанные модели не показывают данные второго. Мне удалось вызвать связанную модель InvoiceItems с моделью Invoices, к которой она имеет много отношений.

Однако обновление приводит к вставке новых записей в таблицу invoice_items вместо обновления текущих связанных записей в таблицу invoices.

Я попытался добавить поле id каждой записи InvoiceItems в представлении _form, чтобы решить эту проблему, но оно все еще существует.

Ниже приводится actionUpdate из 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,
            ]);
        }
    }

Это код _form вида InvoicesController:

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

Следующий снимок экрана наглядно демонстрирует, что у меня получилось:

введите здесь описание изображения

18.01.2016

Ответы:


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", а затем вставляются.. для обновления модель должна быть не новой.. У вас уже есть связанные модели, чтобы сохранить их из почты.. и из загрузки нескольких

Однако, если вам нужно управлять новой моделью (например, потому что вы добавили новую запись в операцию обновления широкой формы), вы можете протестировать

$yourModel->isNewRecord

и если это новая проверка, то, если пользователь правильно настроил связанные поля, вы можете сохранить их с помощью

$yourModel->save(); 

в противном случае вы можете просто отказаться .. (не сохраняя его)

18.01.2016
  • Пожалуйста, посмотрите на мой ответ, в зависимости от вашего. 18.01.2016
  • Я обновил ответ с некоторыми предложениями для новых записей 18.01.2016

  • 2

    Я почти уверен, что этот код ниже, конечно, заполняет массив с именем $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 имеют сценарий «вставка» (может быть, вы разрешаете установку атрибута «ID», но обычно это не разрешено в сгенерированном Gii коде, и тогда вы получаете «новые элементы» всякий раз, когда вы сохраняете.

    если вы добавите return var_dump($invoiceItems);после loadMultiple, вы увидите, что отправленными данными заполнены только атрибуты safe.

    Вы также не проверяете их перед сохранением, что тоже плохо.

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

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

    18.01.2016

    3

    Согласно ответу scaisEdge и данная документация по виджету. Я смог определить решение проблемы.

    Просто в своем коде я пренебрег связью между двумя моделями, когда сказал:

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

    Значение $invoiceItems должно быть получено с использованием соотношения, подобного следующему:

    $invoiceItems = $model->invoiceItems;
    

    Однако у меня все еще есть другая проблема с добавлением новых записей в связанную модель InvoiceItems во время обновления.

    18.01.2016
  • Добавление новых записей немного сложно, потому что добавление для InvoceItems запрашивается в представлении.. но в представлении обычно не выполняется действие.. ну, вы можете сделать это непосредственно в представлении (не правильно ориентированном на MVC), или вы можете сделать с помощью ajax, вызвав сервисное действие для получения новой модели, которая вам нужна. 18.01.2016
  • Я думаю, что последняя ошибка может помочь. то есть я просто загружаю предопределенную InvoiceItems для обновления, а затем создаю новую модель InvoiceItems для новых записей. Вопрос в том, как создать новые поля вставки в представлении и как загрузить их в контроллер. 18.01.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..