В Yii, для обновления разных данных из одной формы в двух таблицах необходимо выполнить следующие действия:
1. Необходимо создать форму в представлении, которая будет принимать данные для обновления двух таблиц. В форме должны быть поля, соответствующие каждой таблице и кнопка отправки формы.
<?php $form = ActiveForm::begin(); ?> <?= $form->field($modelA, 'attributeA')->textInput() ?> <?= $form->field($modelB, 'attributeB')->textInput() ?> <div class="form-group"> <?= Html::submitButton('Сохранить', ['class' => 'btn btn-primary']) ?> </div> <?php ActiveForm::end(); ?>
В данном примере, $modelA и $modelB - это объекты моделей, связанных с таблицами A и B соответственно.
2. Затем, в контроллере, нужно обработать отправку формы и выполнить обновление данных в таблицах.
public function actionUpdate($id) { $modelA = ModelA::findOne($id); $modelB = ModelB::findOne($id); if ($modelA->load(Yii::$app->request->post()) && $modelB->load(Yii::$app->request->post())) { if ($modelA->save() && $modelB->save()) { Yii::$app->session->setFlash('success', 'Данные успешно обновлены.'); return $this->redirect(['view', 'id' => $id]); } } return $this->render('update', [ 'modelA' => $modelA, 'modelB' => $modelB, ]); }
В данном примере, actionUpdate получает идентификатор записи, ищет объекты моделей по этому идентификатору и загружает данные из формы. Затем, если данные успешно загружены и сохранены в обеих таблицах, выводится сообщение об успешном обновлении и выполняется редирект на страницу просмотра.
3. На данном этапе, у вас должны быть настроены модели, связанные с таблицами A и B. Убедитесь, что у моделей определены правила валидации и соответствующие сценарии, если требуется.
<?php namespace appmodels; use yiibaseModel; class ModelA extends Model { public $attributeA; public function rules() { return [ [['attributeA'], 'required'], ]; } } ?>
<?php namespace appmodels; use yiibaseModel; class ModelB extends Model { public $attributeB; public function rules() { return [ [['attributeB'], 'required'], ]; } } ?>
4. Наконец, необходимо создать представления для отображения данных таблицы A и B, а также страницу обновления данных.
<!-- views/modelA/view.php --> <h1><?= $modelA->attributeA ?></h1> ... <!-- views/modelB/view.php --> <h1><?= $modelB->attributeB ?></h1> ...
<!-- views/modelA/update.php --> <?= $this->render('_form', [ 'modelA' => $modelA, 'modelB' => $modelB, ]) ?>
<!-- views/modelB/update.php --> <?= $this->render('_form', [ 'modelA' => $modelA, 'modelB' => $modelB, ]) ?>
Представления view.php используются для отображения данных таблиц по отдельности, а представления update.php используются для отображения формы обновления.
5. Для создания ссылок на страницы просмотра и обновления данных таблицы A и B, можно использовать следующий код в представлении:
<?= Html::a('Просмотр A', ['modelA/view', 'id' => $modelA->id], ['class' => 'btn btn-primary']) ?> <?= Html::a('Обновить A', ['modelA/update', 'id' => $modelA->id], ['class' => 'btn btn-success']) ?> <?= Html::a('Просмотр B', ['modelB/view', 'id' => $modelB->id], ['class' => 'btn btn-primary']) ?> <?= Html::a('Обновить B', ['modelB/update', 'id' => $modelB->id], ['class' => 'btn btn-success']) ?>
В данном примере, Html::a используется для создания ссылок на страницы просмотра и обновления, где параметр 'id' - идентификатор записи.
В итоге, после выполнения всех шагов, вы сможете обновлять данные в двух таблицах из одной формы в Yii. Это позволит сократить количество запросов к базе данных и объединить связанные данные для удобства пользователя и более эффективной работы.