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

Laravel前端更新SEO时出现Attempt to read property 'id' on null错误

问题

作为管理员在前端更新SEO配置时,系统抛出错误:Attempt to read property 'id' on null

控制器代码

public function updateSEO(Request $request)
{
    // first, get the language info from db
    $language = Language::where('code', $request->language)->first();
    $langId = $language->id;

    // then, get the seo info of that language from db
    $seo = SEO::where('language_id', $langId)->first();

    // else update the existing seo info of that language
    $seo->update($request->all());

    $request->session()->flash('success', __('Updated successfully!'));

    return redirect()->back();
}

视图代码

<div class="form-group">
    <label>{{ __('Meta Description For Home Page') }}</label>
    <textarea class="form-control" name="home_meta_description" rows="5"
        placeholder="{{ __('Enter Meta Description') }}">{{ $data->home_meta_description }}</textarea>
</div>

错误原因分析

  • 当Language::where('code', $request->language)->first()查询不到对应语言记录时,$language变量为null,此时读取$language->id会触发Attempt to read property 'id' on null错误。
  • 即使$language存在,SEO::where('language_id', $langId)->first()也可能返回null,后续调用$seo->update()同样会抛出类似空对象操作错误。

解决办法

1. 增加查询结果校验(推荐)

在使用查询结果前先判断是否存在,避免对null对象执行操作:

修正后的控制器代码:

public function updateSEO(Request $request)
{
    // 校验请求参数合法性
    $request->validate([
        'language' => 'required|string',
    ]);

    // 获取语言信息,不存在则返回错误提示
    $language = Language::where('code', $request->language)->first();
    if (!$language) {
        $request->session()->flash('error', __('Invalid language code!'));
        return redirect()->back();
    }
    $langId = $language->id;

    // 获取对应语言的SEO配置,不存在则返回错误提示
    $seo = SEO::where('language_id', $langId)->first();
    if (!$seo) {
        $request->session()->flash('error', __('SEO configuration not found for this language!'));
        return redirect()->back();
    }

    // 更新SEO配置
    $seo->update($request->all());

    $request->session()->flash('success', __('Updated successfully!'));
    return redirect()->back();
}

2. 使用firstOrFail()快速抛出异常

如果希望查询不到记录时直接返回404页面,可以用firstOrFail()替代first():

public function updateSEO(Request $request)
{
    $request->validate([
        'language' => 'required|string',
    ]);

    // 查询不到语言时直接返回404
    $language = Language::where('code', $request->language)->firstOrFail();
    $langId = $language->id;

    // 查询不到SEO配置时直接返回404
    $seo = SEO::where('language_id', $langId)->firstOrFail();

    $seo->update($request->all());

    $request->session()->flash('success', __('Updated successfully!'));
    return redirect()->back();
}

3. 视图层空值防护(可选)

为避免视图中$data为null导致的渲染错误,增加空值判断:

<div class="form-group">
    <label>{{ __('Meta Description For Home Page') }}</label>
    <textarea class="form-control" name="home_meta_description" rows="5"
        placeholder="{{ __('Enter Meta Description') }}">{{ $data?->home_meta_description ?? '' }}</textarea>
</div>

内容的提问来源于stack exchange,提问作者Suraj Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:03:30