You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:13:28