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这种方式获取了关联集合)
其他排查方向
- 确认变量值真的是47:在模板里加一行输出
{{ gettype($product->id) }} | {{ $product->id }},看看实际类型和值是不是和你想的一致,有没有可能变量被意外覆盖了。 - 换用
where查询替代find:如果类型转换还是不行,试试用where按主键查询,它对类型的要求更宽松:
{{ $upgrade->products()->where('id', $product->id)->first()?->created_at }}
- 空值安全处理:不管什么情况,都建议加上空值判断避免报错,比如用PHP 8+的null安全运算符:
{{ $upgrade->products()->find((int)$product->id)?->created_at ?? '无记录' }}
内容的提问来源于stack exchange,提问作者Lukas Komar
相关产品推荐
相关产品推荐

