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

Laravel 9 报错:尝试读取null对象的"id"属性(IndexController第23行)

Laravel 9 错误:Attempt to read property "id" on null 解决方法

问题原因

在app\Http\Controllers\Frontend\IndexController.php文件第23行触发该错误,核心原因是:通过Category::skip(n)->first()查询分类时,若数据库中没有足够的分类数据(比如分类总数小于n+1),查询结果会返回null,此时直接访问->id属性就会抛出"Attempt to read property 'id' on null"错误。

另外你的代码存在一处逻辑错误:$skip_news_1的查询条件误用了$skip_cat_2->id,应该改为$skip_cat_1->id。

修复方案

方案1:先判断分类是否存在,再关联查询新闻

在获取新闻前先检查分类对象是否有效,避免访问null的属性:

public function Index()
{
    // 处理第一个分类及新闻
    $skip_cat_0 = Category::skip(0)->first();
    $skip_news_0 = collect(); // 默认返回空集合,避免视图报错
    if ($skip_cat_0) {
        $skip_news_0 = NewsPost::where('status', 1)
            ->where('category_id', $skip_cat_0->id)
            ->orderBy('id', 'DESC')
            ->limit(5)
            ->get();
    }

    // 处理第二个分类及新闻
    $skip_cat_2 = Category::skip(2)->first();
    $skip_news_2 = collect();
    if ($skip_cat_2) {
        $skip_news_2 = NewsPost::where('status', 1)
            ->where('category_id', $skip_cat_2->id)
            ->orderBy('id', 'DESC')
            ->limit(6)
            ->get();
    }

    // 处理第三个分类及新闻(修正了原代码的逻辑错误)
    $skip_cat_1 = Category::skip(1)->first();
    $skip_news_1 = collect();
    if ($skip_cat_1) {
        $skip_news_1 = NewsPost::where('status', 1)
            ->where('category_id', $skip_cat_1->id) // 原代码误用了$skip_cat_2->id
            ->orderBy('id', 'DESC')
            ->limit(6)
            ->get();
    }

    return view('frontend.index', compact('skip_cat_0', 'skip_news_0', 'skip_cat_2', 'skip_news_2', 'skip_cat_1', 'skip_news_1'));
}

方案2:使用optional()方法安全访问属性

Laravel提供的optional()方法可以在对象为null时返回null,避免直接访问属性报错,但要注意这种情况下会查询category_id为null的新闻,需根据业务需求判断是否适用:

$skip_cat_0 = Category::skip(0)->first();
$skip_news_0 = NewsPost::where('status', 1)
    ->where('category_id', optional($skip_cat_0)->id)
    ->orderBy('id', 'DESC')
    ->limit(5)
    ->get();

方案3:确保数据库有足够分类数据或动态调整skip值

如果业务要求必须基于指定skip的分类查询新闻,可以先统计分类总数,动态调整查询逻辑:

$categoryCount = Category::count();

// 仅当分类总数足够时才查询对应分类的新闻
$skip_cat_0 = $categoryCount > 0 ? Category::skip(0)->first() : null;
$skip_news_0 = $skip_cat_0 ? NewsPost::where('status',1)->where('category_id', $skip_cat_0->id)->orderBy('id','DESC')->limit(5)->get() : collect();

内容的提问来源于stack exchange,提问作者Arief Affandi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:06:15