Laravel软删除分类后索引控制器报错:Call to a member function products() on null
问题分析
报错Call to a member function products() on null的核心原因是:前台productByCategory方法通过Categories::where('name', $name)->first()仅查询未被软删除的分类,但当用户访问已删除分类的前台产品页时(比如通过后台已删除分类页面的无效链接、旧缓存链接),该查询会返回null,后续调用products()自然触发报错。后台CategoryController@trash本身逻辑正常,因为它是专门查询已删除分类的独立页面,和前台逻辑无冲突。
解决方案
1. 前台分类查询增加空值与软删除判断
修改IndexController的productByCategory方法,先判断分类是否存在、是否被软删除,避免调用null对象的方法:
public function productByCategory($name) // 前台按分类展示产品 { // 先查询所有分类(包含软删除的),判断状态 $category = Categories::withTrashed()->where('name', $name)->first(); // 分类不存在时返回404页面 if (!$category) { abort(404); } // 分类已被软删除时,跳转首页并提示 if ($category->trashed()) { return redirect()->route('index')->with('error', '该分类已被删除'); } $productsCategories = $category->products()->get(); return view('products-category', compact('productsCategories','category')); }
如果不需要提示,仅拦截访问,也可以简化为:
public function productByCategory($name) // 前台按分类展示产品 { // 只查询未被软删除的分类,不存在直接返回404 $category = Categories::where('name', $name)->firstOrFail(); $productsCategories = $category->products()->get(); return view('products-category', compact('productsCategories','category')); }
2. 优化后台已删除分类页面的链接(可选)
检查后台categories.trash视图,如果页面中存在指向前台产品页的链接,需要移除或禁用这些链接,避免用户误点击触发报错:
{{-- 后台已删除分类页面示例 --}} @foreach($categories as $category) <tr> <td>{{ $category->name }}</td> <td> {{-- 移除指向前台产品页的链接,只保留恢复/永久删除操作 --}} <a href="{{ route('categories.restore', $category->id) }}">恢复</a> <a href="{{ route('categories.forceDelete', $category->id) }}">永久删除</a> </td> </tr> @endforeach
内容的提问来源于stack exchange,提问作者Amanda Linhan
相关产品推荐
相关产品推荐

