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
相关产品推荐
相关产品推荐

