Yii2 сохраняет связанные записи в одном сохранении в одной транзакции
В yii2 как я могу сохранить несколько связанных записей в db в один вызов сохранения и одну транзакцию.
У меня две таблицы:
User - id, name
UserAddress - id , user_id , city
Таблица пользователей имеет отношение много к таблице UserAdress
Что я хочу сделать:
UserAddress ua = new UserAddress();
ua.city = "fff"
User u = new User();
u.name = "test";
u.userAddress = new Array(ua);
u.save();
вызов сохранения пользователя должен сохранять пользователя и useraddress с помощью user_id, установленного на user.id, а также
Ответы
Ответ 1
// You need create hasMany relation 'userAddress' (look guide relations)
$transaction = Yii::$app->db->beginTransaction();
try {
$user = new User();
$user->name = 'Name';
$user->save();
$ua = new UserAddress();
$ua->city = 'City';
$user->link('userAddress', $ua); // <-- it creates new record in UserAddress table with ua.user_id = user.id
$transaction->commit();
} catch (Exception $e) {
$transaction->rollBack();
}
Ответ 2
В дополнение к предыдущему ответу я предлагаю вариант, который работает без предварительно определенных отношений и с явной обработкой ошибок проверки.
Yii::$app->db->transaction(function(){
$user = new User();
$user->name = 'Name';
if( !$user->save() ){
throw new Exception('Can\'t be saved user model. Errors: '. join(', ', $user->getFirstErrors()));
}
$userAddress = new UserAddress();
$userAddress->city = 'City';
$userAddress->user_id = $user->id;
if( !$userAddress->save() ){
throw new Exception('Can\'t be saved user address model. Errors: '. join(', ', $userAddress->getFirstErrors()));
}
});
Этот код строго гарантирует сохранение обеих записей. Если одна из моделей не может быть сохранена, будет выбрано исключение с ошибкой проверки.