Как я могу отображать поля разных таблиц в одной форме и сразу сохранять их в базе данных... Сценарий заключается в том, что когда я получаю новую форму для заполнения, эти две таблицы объединятся в одну и ту же ФОРМУ и, вероятно, сохранятся в одном и том же время. Вторая проблема заключается в том, что «id» (PK) «form» будет генерировать число постепенно после сохранения. Вопрос в том, как я могу скопировать значение «id» (PK) в «form» в «forminfo_info» (FK) при сохранении... Пожалуйста, нужна помощь в этом..
Yii2 Advanced Отображение и сохранение полей двух таблиц в одной форме
Ответы (1)
Большая часть вашего вопроса действительно объяснена здесь, в руководстве по Yii2 а>.
В любом случае, вот что я бы попробовал в вашем actionUpdate/actionCreate-controller. (Примечание: этот код не тестировался, поэтому могут потребоваться некоторые исправления, но общая структура должна работать.)
// Create empty models, typically for actionCreate()
$m1 = new Model();
$m2 = new AnotherModel();
// ...or load models using ids for actionUpdate($m1Id, $m2Id)
$m1 = Model::findOne($m1Id);
$m2 = AnotherModel::findOne($m2Id);
// Try to populate the models from the request
if ($m1->load(Yii::$app->request->post()) && $m2->load(Yii::$app->request->post())) {
// Models now loaded, but not validated
if ($m1->validate() && $m2->validate()) {
// Both models are now validated, save the first one
$m1->save(false); // No need to validate again
// Now Model has an id, save its id as a reference in AnotherModel
$m2->m1Id = $m1->id;
// ...or create a method in your Model-model for setting the foreign key
// $m2->connectModel($m1); // The fancier object oriented way
$m2->save(false); // Set true if you validate the foreign key
}
}
// Return view for rendering
Если какая-либо из двух операций сохранения не удалась (не проверена в коде), это своего рода фатальная ошибка, которую, вероятно, следует обработать. В худшем случае вы можете сохранить одну модель, а другую нет, хотя это маловероятно, если проверка пройдет успешно. Посмотрите на транзакции для «атомарного» сохранения (все или ничего), если ваша база данных поддерживает это, или просто оставьте его (я думаю, что большинство просто оставляет его или записывает ошибку на потом).