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

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,或者关联的配送费记录已被删除,导致关联查询结果为空。
  • 无空值兜底:视图中直接访问关联属性,没有对关联不存在的场景做兼容处理。

修复步骤

  1. 解决字段与关联重名冲突
    如果明细表中确实存在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>
  1. 查询时预加载关联
    修改控制器查询逻辑,预加载关联避免N+1查询问题:
$detail_transaksi =  DetailTransaksiPengiriman::with('ruteBiayaPengantaran')
    ->where('noinvoice', $noinvoice)
    ->get();
  1. 视图增加空值判断兜底
    避免脏数据导致页面报错,访问关联属性前先判断是否存在:
<small>Rute Pengantaran:
    @if($item->ruteBiayaPengantaran)
        {{ $item->ruteBiayaPengantaran->rute_asal }} -
        {{ $item->ruteBiayaPengantaran->rute_tujuan }}
    @else
        未配置路由
    @endif
</small>
  1. 清理脏数据
    执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:54:22