Laravel用Eloquent获取关联表字段 分页到第二页报非对象属性错误
问题原因
错误本质是你尝试对null值调用image属性,具体触发场景:
- 第一页返回的6条商品全部在
product_images表有对应的关联记录,$p->images->first()可以返回有效的图片对象,因此访问正常 - 第二页的商品列表中存在至少1条没有关联任何图片的商品,
$p->images->first()返回null,再调用->image就抛出该错误
另外存在1个不规范的隐患点:你在Products模型中定义的关联方法名为大写开头的Images,但视图中调用时使用的是小写的images,PHP本身对方法名大小写不敏感,不会直接触发错误,但不符合代码规范容易留下隐患。
解决方案
你可以按需选择以下任意一种或组合使用:
- 视图层增加空值兼容,没有图片时显示默认占位图:
@foreach ($products as $p) <a href="#"><img src="{{ asset('images/products/'.optional($p->images->first())->image ?? 'default_product.png') }}" alt=""></a> @endforeach
你需要提前把默认占位图default_product.png放到public/images/products/目录下,也可以替换成你自己的占位图路径。
- 数据查询层过滤无图商品,同时预加载关联减少SQL查询次数:
// has()方法会筛选出至少存在1张关联图片的商品,with()预加载关联避免N+1查询问题 $products = Products::with('images')->has('images')->paginate(6); return view('products', ['products' => $products]);
用这个方案的话,列表里所有商品都一定有图片,不会出现空值调用的问题。
- 规范关联方法命名,保持调用和定义的大小写一致:可以把模型里的关联方法
public function Images()改成public function images(),符合Laravel的命名规范。
内容的提问来源于stack exchange,提问作者Nanu
相关产品推荐
相关产品推荐

