Yii2 — сохранение нескольких связанных моделей ActiveRecord в одной форме

Вот структура таблицы:

Table BaseTable
id (primary key) INT
description VARCHAR(255)

Table ChildTable
id (primary key)(foreign key reference to BaseTable) INT
child_property VARCHAR(255)

На самом деле это отношение наследования в таблице базы данных.

Тогда я использую gii генерировать модели с функцией отношения для обоих и CRUD-операцией для ChildTable. Вот функция отношения в ChildTable:

public function getBaseTable()
{
return $this->hasOne(BaseTable::className(), ['id' => 'id']);
}

В сгенерированной форме ChildTable я хотел бы обновить свойство description это BaseTable. Вот оригинальная форма ChildTable:

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

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

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

Попробуйте 1:

Я добавляю поле кода ниже:

<?= $form->field($model, 'baseTable.description')->textInput() ?>

Я получил эту ошибку:

Getting unknown property: app\models\ChildTable::baseTable.description

Попробуйте 2:

Я поле рекламного кода ниже:

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

Я получил еще одну ошибку:

Call to a member function formName() on null

Попробуйте 3:

Я использую отношение, чтобы получить модель BaseTable, код, как показано ниже:

<?= $form->field($model->getBaseTable()->one(), 'description')->textInput() ?>

Я все еще получил ошибку:

Call to a member function formName() on null

Идея:

У меня появилась идея, что я могу создать новую viewModel для сопоставления всего свойства из BaseTable а также ChildTable, Но я хотел бы знать, есть ли быстрое решение для реализации нескольких связанных ActiveRecord модели основаны на коде, сгенерированном gii? Спасибо!

4

Решение

Это:

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

должен работать с baseTable правильное имя отношения. Связанная запись просто не существует (это null как видно из ошибки).

Это может быть либо ошибка, связанная с неправильным заполнением предыдущих отношений, либо связь необязательна.

В последнем случае вам нужно проверить его на наличие (другими словами, null) до доступа и отображения.

Это: $model->getBaseTable()->one() не имеет никакого смысла, потому что это равно $model->baseTable, Не стоит так называть отношения.

А насчет пути с точечной нотацией — здесь не получится.

Для загрузки и сохранения нескольких записей вы можете использовать:

Тогда просто позвоните save() в цикле.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]