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

Laravel Blade中使用变量查询关联对象出现非对象错误的问题

解决Laravel多对多关联查询中变量传参报错问题

先排查最常见的类型不匹配问题

你遇到的核心问题是:用变量$product->id查询返回null(导致“非对象”报错),但直接传数字47能查到。大概率是变量类型不匹配——比如$product->id是字符串类型,而你的主键id是整数类型,find()方法会严格匹配类型,所以字符串的"47"和整数的47匹配不上。

解决办法很简单,强制把变量转成整数:

{{ $upgrade->products()->find((int)$product->id)?->created_at }}

或者用findOrFail()替代find(),这样如果真的查不到会直接抛出异常,方便你确认是不是类型问题:

{{ $upgrade->products()->findOrFail((int)$product->id)->created_at }}

检查多对多关联的中间表字段是否正确加载

如果你的created_at是存在于多对多中间表的字段,那你必须在模型的关联定义里指定要加载这个字段,否则拿不到。比如在Product模型里:

public function upgrades()
{
    return $this->belongsToMany(Upgrade::class)->withPivot('created_at');
}

或者在Upgrade模型里:

public function products()
{
    return $this->belongsToMany(Product::class)->withPivot('created_at');
}

之后你可以直接通过关联模型的pivot属性获取:

{{ $upgrade->pivot->created_at }}

(前提是你已经预加载了关联,或者通过$product->upgrades这种方式获取了关联集合)

其他排查方向

  1. 确认变量值真的是47:在模板里加一行输出{{ gettype($product->id) }} | {{ $product->id }},看看实际类型和值是不是和你想的一致,有没有可能变量被意外覆盖了。
  2. 换用where查询替代find:如果类型转换还是不行,试试用where按主键查询,它对类型的要求更宽松:
{{ $upgrade->products()->where('id', $product->id)->first()?->created_at }}
  1. 空值安全处理:不管什么情况,都建议加上空值判断避免报错,比如用PHP 8+的null安全运算符:
{{ $upgrade->products()->find((int)$product->id)?->created_at ?? '无记录' }}

内容的提问来源于stack exchange,提问作者Lukas Komar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:36:19