Laravel显示外键表jenis_lapors的name字段时遇空属性读取错误
Laravel中读取关联模型字段报错:
Attempt to read property "name" on null 我尝试在Laravel项目中显示jenis_lapors表的name字段,但代码出现错误:Attempt to read property "name" on null。我发现jenis关联方法似乎没有正确传递jenisLapor模型,不知道该如何解决。
相关代码
jenisLapor 模型
class jenisLapor extends Model { use HasFactory; protected $table = 'jenis_lapors'; protected $fillable = [ 'id', 'name' ]; }
lapor 模型
class lapor extends Model { use HasFactory; public const Perempuan = 1; public const Laki = 0; protected $fillable = ['jenis_Lapor_id', 'name', 'jenisKelamin', 'rumah', 'pekerjaan', 'kantor', 'email', 'ktp', 'phone_number', 'subjek', 'isian', 'tanggal_kejadian', 'lokasi', 'tujuan_pengaduan']; public function jenis() { return $this->belongsTo(jenisLapor::class); } }
Post 控制器
public function index() { $laporans = lapor::with('jenis')->get(); return view('auth.aduan.index',['laporans' => $laporans]); }
index.blade.php 视图
@foreach($laporans as $laporan) <tr> <td> {{ $laporan->name }} </td> <td> {{ $laporan->jenisKelamin == 1 ? 'Perempuan' : 'Laki-laki' }} </td> <td> {{ $laporan->rumah }} </td> <td> {{ $laporan->pekerjaan }} </td> <td> {{ $laporan->kantor }} </td> <td> {{ $laporan->email }} </td> <td> {{ $laporan->ktp }} </td> <td> {{ $laporan->phone_number }} </td> <td> {{ $laporan->jenis->name }} </td> <td> {{ $laporan->subjek }} </td> <td> {{ $laporan->isian }} </td> <td> {{ $laporan->tanggal_kejadian }} </td> <td> {{ $laporan->lokasi}} </td> <td> {{ $laporan->tujuan }} </td> <td> <a href="" class="btn btn-sm btn-success"><i class="fas fa-eye"></i></a> <a href="" class="btn btn-sm btn-info"><i class="fa fa-edit"></i></a> <a href="" class="btn btn-sm btn-danger"><i class = "fa fa-trash"></i></a> </td> </tr> @endforeach
问题原因及解决办法
原因1:关联外键不匹配
Laravel的belongsTo关联默认会使用关联方法名_id作为外键字段,但你的lapor表中外键是jenis_Lapor_id,而关联方法名是jenis,默认外键会被解析为jenis_id,和实际字段名不匹配,导致关联无法正确加载,返回null。
解决办法1:显式指定外键
修改lapor模型中的jenis关联方法,明确指定外键字段:
public function jenis() { return $this->belongsTo(jenisLapor::class, 'jenis_Lapor_id'); }
原因2:存在无效关联数据
如果数据库中部分lapor记录的jenis_Lapor_id为空,或者该ID在jenis_lapors表中没有对应数据,$laporan->jenis会返回null,此时访问->name就会触发报错。
解决办法2:视图中做判空处理
在Blade视图中使用安全访问运算符?->或者条件判断避免报错:
<td> {{ $laporan->jenis?->name ?? '无类型' }} </td>
或者使用传统条件判断:
<td> {{ isset($laporan->jenis) ? $laporan->jenis->name : '无类型' }} </td>
额外建议:遵循Laravel命名规范
- 模型类名采用大驼峰命名(比如
JenisLapor、Lapor),符合PSR-4自动加载规范和Laravel惯例; - 外键字段建议用全小写蛇形命名(比如
jenis_lapor_id),和模型名的蛇形形式对应,减少命名混淆。
内容的提问来源于stack exchange,提问作者Aki Aki
相关产品推荐
相关产品推荐

