Laravel中Blade@admin权限控制报错:Attempt to read property "id" on int
问题分析与解决方案
错误「Attempt to read property "id" on int」的核心原因是:$this->role返回的是一个整数,而非Role模型的实例,导致调用->id时触发类型错误。
可能的原因及对应解决方法
1. User模型未正确定义与Role的关联关系
如果User模型里没有定义role关联方法,Laravel会将$this->role视为数据库字段直接读取。若users表中存在名为role的整数字段(比如存储角色ID),就会返回整数,进而报错。
解决:
在User模型中添加关联方法:
public function role() { return $this->belongsTo(Role::class); }
同时确保users表中存储角色关联的字段是role_id(而非role),且该字段是指向roles表id字段的外键。
2. 未预加载关联或关联未正确加载
即使定义了关联,若未预加载role,或者关联数据不存在,也可能导致$this->role返回null或整数(若字段名冲突)。
解决:
修改isposs方法,增加空值判断,避免报错:
public function isposs() { // 先验证关联是否为Role实例,再判断ID return $this->role instanceof \App\Models\Role && $this->role->id == 10; // 或者使用Laravel 8+支持的可选属性访问符简化代码 // return $this->role?->id == 10; }
3. 数据库字段命名冲突
如果users表中确实存在role字段(存储整数类型的角色ID),这会和关联方法名冲突,导致Laravel优先读取字段值而非关联模型。
解决:
重命名users表中的role字段为role_id,并确保迁移文件和模型关联匹配。
内容的提问来源于stack exchange,提问作者Bakr Beshr
相关产品推荐
相关产品推荐

