activerecord - example - Yii2 guardar registros relacionados en una sola llamada guardada en una sola transacción
yii2 like (2)
Además de la respuesta anterior, propongo una variante que funciona sin relaciones preliminares definidas y con un manejo explícito de los errores de validación.
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()));
}
});
Este código garantiza estrictamente que se guardarán ambos registros. Si uno de los modelos no se puede guardar, se lanzará una excepción con un error de validación.
En yii2, ¿cómo puedo guardar varios registros relacionados en db en una sola llamada de salvar y en una sola transacción? Tengo dos mesas:
User - id, name
UserAddress - id , user_id , city
La tabla de usuarios tiene una o muchas relaciones con la tabla UserAdress
Lo que quiero hacer es:
UserAddress ua = new UserAddress();
ua.city = "fff"
User u = new User();
u.name = "test";
u.userAddress = new Array(ua);
u.save();
llamar a guardar en usuario debe guardar la dirección de usuario y usuario con user_id establecido en user.id también
// 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();
}