Laravel获取已软删除分类关联产品报错:Call to a member function products() on null
问题解决:Laravel软删除分类关联产品报错
Call to a member function products() on null 问题根源
默认情况下,Eloquent查询会自动排除被软删除的模型。你要找的分类已经被软删除,所以Categories::where('name', $name)->first()返回了null,调用null->products()自然就触发报错。修改关联方法名称没用,因为问题出在分类的查询逻辑上,和关联方法名无关。
解决方案
1. 修改分类查询,包含软删除记录
在查询分类时加上withTrashed(),这样就能获取到已被软删除的分类:
// IndexController public function productByCategory($name) { // 新增withTrashed(),让查询包含软删除的分类 $categories = Categories::withTrashed()->where('name', $name)->first(); // 额外处理:如果分类确实不存在(无论是否软删除),返回404避免后续报错 if (!$categories) { abort(404, '分类不存在'); } $productsCategories = $categories->products()->get(); return view('products-category', compact('productsCategories','categories')); }
2. 特殊场景补充
如果你的需求是仅获取已软删除分类的产品,可以把withTrashed()换成onlyTrashed():
$categories = Categories::onlyTrashed()->where('name', $name)->first();
另外你在Product模型的category()关联里加了withTrashed(),这是为了让产品能关联到已软删除的分类;但反过来从分类查产品时,必须确保分类本身的查询能覆盖软删除记录,这就是要在分类查询链里加withTrashed()的原因。
内容的提问来源于stack exchange,提问作者Amanda Linhan
相关产品推荐
相关产品推荐

