Blade获取payment_status->title时报非对象属性错误如何解决
报错原因
- 关联属性名称不匹配:你预加载使用的是驼峰命名的
paymentStatus关联,访问未序列化的模型实例时,默认需要和关联方法命名保持一致。你当前用下划线格式payment_status读取关联,无法拿到对应对象,返回null后访问title属性就会触发报错。你返回的JSON里显示的payment_status是序列化时自动转换的蛇形格式,不能直接对应模型的动态属性名。 - 存在空关联数据:部分订单可能没有对应的支付记录,或是支付记录没有对应的支付状态关联,导致中间某一层关联返回null,访问属性直接报错。
解决步骤
- 修正关联属性的写法
优先把视图调用代码改为和预加载一致的驼峰格式:
@foreach($orders as $order) <tr> <td>{{ $order->payment->paymentStatus->title }}</td> </tr> @endforeach
如果你的模型设置了$snakeAttributes = true(Laravel默认配置)确实支持蛇形访问驼峰关联,可以先在代码中打印dd($order->payment),确认关联返回对象中支付状态的键名,对应调整即可。
- 增加空值防护
如果使用PHP8及以上版本,直接用null安全运算符加默认值即可,就算中间某层关联为空也不会触发报错:
{{ $order->payment?->paymentStatus?->title ?? '未查询到支付状态' }}
PHP8以下版本可以使用Laravel提供的optional辅助函数:
{{ optional(optional($order->payment)->paymentStatus)->title ?? '未查询到支付状态' }}
- 查询时过滤无效数据(可选)
如果业务要求展示的订单必须有支付记录,可以在查询时增加whereHas条件,过滤掉无支付关联的订单,从源头避免空关联问题:
$orders = $this ->query() ->where('user_id', '=', $id) ->whereHas('payment') ->with(['payment', 'payment.paymentStatus']) ->get();
内容的提问来源于stack exchange,提问作者zyyyzzz
相关产品推荐
相关产品推荐

