Yii2在单个交易中的单个保存调用中保存相关记录



在yii2中,我如何将多个相关记录保存到数据库中,以进行单个保存调用和单个事务。我有两张桌子:

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();

在用户上调用save应该保存user_id设置为user.id的用户和useraddress以及

 // 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();
}

除了前面的答案之外,我还提出了一种变体,它在没有预先定义关系的情况下工作,并且可以显式处理验证错误。

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()));
    }
});

此代码严格确保两个记录都将被保存。如果其中一个模型无法保存,将引发带有验证错误的异常。

最新更新