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

Blade获取payment_status->title时报非对象属性错误如何解决

报错原因

  1. 关联属性名称不匹配:你预加载使用的是驼峰命名的paymentStatus关联,访问未序列化的模型实例时,默认需要和关联方法命名保持一致。你当前用下划线格式payment_status读取关联,无法拿到对应对象,返回null后访问title属性就会触发报错。你返回的JSON里显示的payment_status是序列化时自动转换的蛇形格式,不能直接对应模型的动态属性名。
  2. 存在空关联数据:部分订单可能没有对应的支付记录,或是支付记录没有对应的支付状态关联,导致中间某一层关联返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:54:02