In yii2 how can i save multiple related records into db into single save call and single transaction. I have two tables:
User - id, name
UserAddress - id , user_id , city
User table has one to many relation to UserAdress table
What i want to do is :
UserAddress ua = new UserAddress();
ua.city = "fff"
User u = new User();
u.name = "test";
u.userAddress = new Array(ua);
u.save();
calling save on user should save user and useraddress with user_id set to user.id as well
// 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();
}
Additionally to previous answer I propose variant that works without preliminarily defined relations and with explicit handling of validation errors.
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()));
}
});
This code strictly ensures that both records will be saved. If one of model can't be saved, will be thrown exception with validation error.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With