Laravel8报错Trying to get property 'rute_asal' of non-object排查
Laravel 8 报错:Trying to get property 'rute_asal' of non-object 修复方案
问题场景
在Laravel 8项目中查询配送交易明细,遍历数据访问关联的配送费用模型rute_asal属性时抛出上述错误,已在模型中定义belongsTo关联但问题未解决。
原有代码
控制器代码
$biaya_pengantaran = BiayaPengantaran::latest()->get(); $biaya_pelayaran = BiayaPelayaran::latest()->get(); $detail_transaksi = DetailTransaksiPengiriman::where('noinvoice', $noinvoice)->get(); return view('pengiriman.create', compact('biaya_pengantaran', 'biaya_pelayaran', 'detail_transaksi'));
视图代码
@foreach ($detail_transaksi as $item) <tr> <td>{{ $loop->iteration }}</td> <td> <small>Nama Penerima: {{ $item->nama_penerima }}</small><br> <small>Telepon Penerima: {{ $item->telepon_penerima }}</small><br> <small>Alamat Penerima: {{ $item->alamat_penerima }}</small> <br> <small>Rute Pengantaran: {{ $item->biaya_pengantaran->rute_asal }} - {{ $item->biaya_pengantaran->rute_tujuan }} </small><br> <br> <small>Merk/Tipe: {{ $item->merk_type }}</small><br> <small>Warna: {{ $item->warna }}</small><br> <small>No. Polisi: {{ $item->no_polisi }}</small> <br> <small>Biaya Pengantaran {{ number_format($item->biaya_pengantaran) }}</small><br> <small>Biaya Koordinasi {{ number_format($item->biaya_koordinasi) }}</small> </td> <td><b>{{ number_format($item->total_biaya_per_unit) }}</b></td> </tr> @endforeach
模型关联代码
public function biaya_pengantaran() { return $this->belongsTo(BiayaPengantaran::class); }
排查方向
- 字段名冲突:视图中同时调用
$item->biaya_pengantaran做数字格式化(取金额字段值)和关联模型属性访问。如果交易明细表本身存在名为biaya_pengantaran的金额字段,Laravel模型属性优先级高于关联方法,会直接返回数字而非关联模型对象,访问属性必然报错。 - 关联外键不匹配:
belongsTo关联默认以「关联方法名+_id」作为外键,即当前关联默认读取明细表的biaya_pengantaran_id字段关联配送费表主键。如果实际外键字段名不符合该约定,关联查询会返回null。 - 脏数据存在:部分明细记录的关联外键为null、0,或者关联的配送费记录已被删除,导致关联查询结果为空。
- 无空值兜底:视图中直接访问关联属性,没有对关联不存在的场景做兼容处理。
修复步骤
- 解决字段与关联重名冲突
如果明细表中确实存在biaya_pengantaran金额字段,修改关联方法名避免冲突:
// DetailTransaksiPengiriman 模型中修改关联方法名 public function ruteBiayaPengantaran() { // 手动指定外键字段,确保关联正确 return $this->belongsTo(BiayaPengantaran::class, 'biaya_pengantaran_id', 'id'); }
对应视图中访问路由属性的代码同步修改:
<small>Rute Pengantaran: {{ $item->ruteBiayaPengantaran->rute_asal }} - {{ $item->ruteBiayaPengantaran->rute_tujuan }} </small>
- 查询时预加载关联
修改控制器查询逻辑,预加载关联避免N+1查询问题:
$detail_transaksi = DetailTransaksiPengiriman::with('ruteBiayaPengantaran') ->where('noinvoice', $noinvoice) ->get();
- 视图增加空值判断兜底
避免脏数据导致页面报错,访问关联属性前先判断是否存在:
<small>Rute Pengantaran: @if($item->ruteBiayaPengantaran) {{ $item->ruteBiayaPengantaran->rute_asal }} - {{ $item->ruteBiayaPengantaran->rute_tujuan }} @else 未配置路由 @endif </small>
- 清理脏数据
执行SQL查询无效关联的记录,补全正确的外键值:
-- 查询关联无效的异常记录 SELECT * FROM detail_transaksi_pengiriman WHERE biaya_pengantaran_id IS NULL OR biaya_pengantaran_id NOT IN (SELECT id FROM biaya_pengantaran);
内容的提问来源于stack exchange,提问作者Arya Rizky Sandi
相关产品推荐
相关产品推荐

