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

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

相关产品推荐
方舟 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