Laravel 10关联查询报错:Attempt to read property 'tahun' on int
解决Laravel关联访问报错:Attempt to read property 'tahun' on int
你遇到的问题核心是Laravel没有正确识别关联关系,导致$siswa->angkatan返回的是数据库里存的int类型外键值,而非Angkatan模型实例。结合你使用现成数据库的情况,大概率是关联字段命名不符合Laravel默认规则,以下是具体排查和解决步骤:
第一步:确认Siswa表的外键字段名
打开数据库查看Siswa表,关联Angkatan的字段是叫angkatan还是angkatan_id?Laravel默认会用关联模型名(小写)+_id作为外键,比如angkatan_id,但如果你的数据库里这个字段直接叫angkatan(存的是Angkatan的ID值),必须在关联定义里手动指定外键。修改Siswa模型里的关联方法:
public function angkatan() { // 第二个参数是Siswa表中关联Angkatan的字段名 return $this->belongsTo(Angkatan::class, 'angkatan'); }第二步:检查Angkatan模型的主键是否非默认值
如果Angkatan表的主键不是默认的id(比如主键是tahun),还要在关联里额外指定关联模型的主键字段:public function angkatan() { // 第三个参数是Angkatan表的主键字段名 return $this->belongsTo(Angkatan::class, 'angkatan', 'tahun'); }第三步:确保预加载和关联方法名一致
控制器里的with('angkatan')要和模型里的关联方法名完全匹配,别打错字。第四步:视图里添加空值判断(可选但推荐)
避免个别学生没有关联Angkatan数据时再次报错,可用以下写法:{{ $siswa->angkatan ? $siswa->angkatan->tahun : '无年级数据' }}或者用Laravel的
optional辅助函数简化:{{ optional($siswa->angkatan)->tahun ?? '无年级数据' }}
内容的提问来源于stack exchange,提问作者HALIM
相关产品推荐
相关产品推荐

