Как записывать данные сразу в 2 таблицы в yii2?

Пользователь

от jensen , в категории: PHP , год назад

Как записывать данные сразу в 2 таблицы в yii2?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от fidel , год назад

@jensen 

Для записи данных в две таблицы в Yii2 можно использовать транзакции и модели ActiveRecord.

  1. Определите связи между таблицами в моделях ActiveRecord. Для этого можно использовать методы hasOne() или hasMany() в зависимости от типа отношения между таблицами.


Например, если у вас есть таблицы table1 и table2, и каждая запись в table1 может иметь несколько связанных записей в table2, то связь можно определить так:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Table1 extends yiidbActiveRecord
{
    public function getTable2()
    {
        return $this->hasMany(Table2::className(), ['table1_id' => 'id']);
    }
}

class Table2 extends yiidbActiveRecord
{
    public function getTable1()
    {
        return $this->hasOne(Table1::className(), ['id' => 'table1_id']);
    }
}


  1. Создайте новые записи для каждой таблицы. Можно использовать метод create() для создания новой модели ActiveRecord и заполнения ее атрибутов.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$table1 = new Table1();
$table1->attribute1 = 'value1';
$table1->attribute2 = 'value2';
$table1->save();

$table2 = new Table2();
$table2->attribute3 = 'value3';
$table2->attribute4 = 'value4';
$table2->table1_id = $table1->id;
$table2->save();


  1. Оберните создание записей в транзакцию, чтобы гарантировать атомарность операции.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
$transaction = Yii::$app->db->beginTransaction();

try {
    $table1 = new Table1();
    $table1->attribute1 = 'value1';
    $table1->attribute2 = 'value2';
    $table1->save();

    $table2 = new Table2();
    $table2->attribute3 = 'value3';
    $table2->attribute4 = 'value4';
    $table2->table1_id = $table1->id;
    $table2->save();

    $transaction->commit();
} catch (Exception $e) {
    $transaction->rollBack();
    throw $e;
}


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