Laravel访问服务提供者资料页报Trying to get property 'image' of non-object错误怎么解决
问题根因
该报错的核心原因是SproviderProfileComponent中查询返回的$sprovider变量为null,你在Blade模板里直接访问了null对象的image属性,触发了非对象属性访问错误。
排查步骤
- 第一步:确认当前登录用户是否在
service_providers表中存在对应关联记录,你可以在组件render方法中临时加调试代码验证:
public function render() { $sprovider = ServiceProvider::where('user_id',Auth::user()->id)->first(); dd($sprovider); // 访问页面如果输出null,即可确认是记录不存在的问题 return view('livewire.sprovider.sprovider-profile-component',['sprovider'=>$sprovider])->layout('layouts.base'); }
- 第二步:如果记录不存在,检查你的用户注册/服务提供者身份开通逻辑,确认身份开通时是否会自动写入
service_providers表,且正确关联对应用户的user_id。 - 第三步:如果记录存在,检查
ServiceProvider模型是否配置了错误的表名、软删除等过滤规则,导致正常记录被查询逻辑过滤。
解决方案
方案1:查询兜底避免空对象
如果允许未完善资料的服务提供者访问页面,可以把查询方法替换为firstOrNew(),没有对应记录时自动返回空白模型实例:
// 替换原first()方法 $sprovider = ServiceProvider::where('user_id',Auth::user()->id)->firstOrNew(['user_id' => Auth::user()->id]);
方案2:模板层加空判断
在Blade模板所有调用$sprovider属性的位置,使用PHP空对象运算符?->避免空对象报错:
{{-- 所有$sprovider->xxx替换为$sprovider?->xxx --}} @if($sprovider?->image) <img src="{{asset('images/sproviders')}}/{{$sprovider->image}}" width="100%" /> @else <img src="{{asset('images/sproviders/default.jpg')}}" width="100%" /> @endif {{-- 其他字段同理修改 --}} <p>{{$sprovider?->about}}</p> <p><b>City: </b>{{$sprovider?->city}}</p> @if($sprovider?->service_category_id) {{$sprovider?->category?->name}} @endif <p><b>Service Locations: {{$sprovider?->service_locations}}</b></p>
方案3:新增未初始化跳转逻辑
如果要求服务提供者必须先完成初始化才能访问资料页,可加判断跳转至初始化页面:
public function render() { $sprovider = ServiceProvider::where('user_id',Auth::user()->id)->first(); if(!$sprovider) { return redirect()->route('sprovider.init_profile'); // 替换为你自己的初始化页面路由 } return view('livewire.sprovider.sprovider-profile-component',['sprovider'=>$sprovider])->layout('layouts.base'); }
补充注意点
你当前ServiceProvider模型的$fillable属性仅配置了user_id,后续如果要更新头像、简介、城市等其他字段,需要把对应字段名也加入$fillable数组,否则会触发批量赋值错误。
内容的提问来源于stack exchange,提问作者Dren
相关产品推荐
相关产品推荐

