You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii2实现数据库事务时出现Attempt to read property "id" on int错误求助

Yii2数据库事务实现错误解决:Attempt to read property "id" on int

错误原因

你代码里的$connection->createCommand()->insert()->execute()方法返回的是受影响的行数(整数类型),并非User模型实例,所以直接调用$user_model->id会触发"在整数上读取属性id"的错误。

解决方案

方案1:使用ActiveRecord模型(推荐,符合Yii2最佳实践)

假设已创建对应数据表的ActiveRecord模型User(对应tbl_user)和UserRole(对应tbl_user_roles):

$transaction = Yii::$app->db->beginTransaction();
try {
    // 创建User模型并赋值保存
    $user_model = new User();
    $user_model->name = 'yii';
    $user_model->status = 1;
    $user_model->save(); // 保存成功后,模型自动填充主键id字段

    // 创建UserRole模型关联用户
    $role_model = new UserRole();
    $role_model->role = 'admin';
    $role_model->user_id = $user_model->id;
    $role_model->save();

    $transaction->commit();
} catch (\Exception $e) {
    $transaction->rollback();
    // 可添加日志记录或异常处理逻辑
    throw $e;
}

如果不需要模型验证,可使用save(false)跳过验证步骤。

方案2:使用createCommand获取自增ID

若坚持使用原生SQL命令的方式,可通过getLastInsertID()获取刚插入的用户主键ID:

$transaction = Yii::$app->db->beginTransaction();
try {
    // 执行用户插入操作
    Yii::$app->db->createCommand()
        ->insert('tbl_user', [
            'name' => 'yii',
            'status' => 1,
        ])->execute();
    
    // 获取刚插入的用户ID(需确保tbl_user主键为自增类型)
    $user_id = Yii::$app->db->getLastInsertID();

    // 插入用户角色关联数据
    Yii::$app->db->createCommand()
        ->insert('tbl_user_roles', [
            'role' => 'admin',
            'user_id' => $user_id
        ])->execute();

    $transaction->commit();
} catch (\Exception $e) {
    $transaction->rollback();
    // 可添加日志记录或异常处理逻辑
    throw $e;
}

注意事项

  • 确保tbl_user表的主键字段设置为自增,否则getLastInsertID()无法正确获取ID
  • 事务中任何一步操作失败都会触发回滚,需确保异常能被正确捕获
  • 生产环境建议添加错误日志记录,便于排查问题

内容的提问来源于stack exchange,提问作者Quentinb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 06:27:35