Как обновить разные данные в двух таблицах из одной формы?

В 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. Это позволит сократить количество запросов к базе данных и объединить связанные данные для удобства пользователя и более эффективной работы.