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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:22:35