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

