Laravel错误:Attempt to read property "name" on int 求助解决
问题排查与解决
1. 视图关联调用错误
Blade视图中你写了$item->dataguru->name,但ReportData模型里的关联方法是guru(),正确调用应为$item->guru->name,这是直接的错误点。
2. 关联方法与数据库字段名冲突(核心原因)
你的ReportData模型fillable数组包含perusahaan、siswa、wilayah、guru、jurusan这些字段,同时关联方法也用了相同名字。当调用$item->guru时,Laravel会优先返回数据库中存储的整数字段值(外键ID),而非关联的DataGuru对象,导致你试图在整数上访问name属性,触发「Attempt to read property "name" on int」错误。
解决方法
方案一:修改关联方法名避免冲突
修改ReportData模型的关联方法名,同时指定外键:
class ReportData extends Model { use HasFactory; use SoftDeletes; protected $fillable = [ "perusahaan", "siswa", "wilayah", "guru", "jurusan", ]; public function perusahaanRelation() { return $this->belongsTo(Perusahaan::class, 'perusahaan'); } public function wilayahRelation() { return $this->belongsTo(Perusahaan::class, 'wilayah'); } public function siswaRelation() { return $this->belongsTo(DataSiswa::class, 'siswa'); } public function guruRelation() { return $this->belongsTo(DataGuru::class, 'guru'); } public function jurusanRelation() { return $this->belongsTo(Jurusan::class, 'jurusan'); } }
控制器更新预加载关联名:
$reportdata = ReportData::with('siswaRelation', 'guruRelation', 'perusahaanRelation', 'jurusanRelation', 'wilayahRelation')->get();
视图对应修改调用:
<td>{{ $item->siswaRelation->name }}</td> <td>{{ $item->perusahaanRelation->name }}</td> <td>{{ $item->perusahaanRelation->wilayah }}</td> <td>{{ $item->guruRelation->name }}</td> <td>{{ $item->jurusanRelation->jurusan }}</td>
方案二:修改数据库字段名(推荐,符合Laravel最佳实践)
将ReportData表的外键字段改为xxx_id格式(如guru改为guru_id),Laravel会自动识别外键:
- 生成迁移修改字段名:
Schema::table('report_data', function (Blueprint $table) { $table->renameColumn('perusahaan', 'perusahaan_id'); $table->renameColumn('siswa', 'siswa_id'); $table->renameColumn('wilayah', 'wilayah_id'); $table->renameColumn('guru', 'guru_id'); $table->renameColumn('jurusan', 'jurusan_id'); });
- 更新
ReportData模型:
class ReportData extends Model { use HasFactory; use SoftDeletes; protected $fillable = [ "perusahaan_id", "siswa_id", "wilayah_id", "guru_id", "jurusan_id", ]; public function perusahaan() { return $this->belongsTo(Perusahaan::class); } public function wilayah() { return $this->belongsTo(Perusahaan::class); } public function siswa() { return $this->belongsTo(DataSiswa::class); } public function guru() { return $this->belongsTo(DataGuru::class); } public function jurusan() { return $this->belongsTo(Jurusan::class); } }
- 仅需修正视图中的
$item->dataguru->name为$item->guru->name即可,控制器无需修改。
3. 处理关联记录不存在的情况
为避免关联记录不存在时触发空属性错误,可使用optional()或空合并运算符:
<td>{{ optional($item->siswa)->name ?? '-' }}</td> <td>{{ optional($item->perusahaan)->name ?? '-' }}</td> <td>{{ optional($item->perusahaan)->wilayah ?? '-' }}</td> <td>{{ optional($item->guru)->name ?? '-' }}</td> <td>{{ optional($item->jurusan)->jurusan ?? '-' }}</td>
内容的提问来源于stack exchange,提问作者M Idham Khaliq
相关产品推荐
相关产品推荐

