Laravel报错:Trying to get property 'AccmId' of non-object 技术求助
问题解决:Trying to get property 'AccmId' of non-object
错误原因
报错核心是$result['accm_sys_detail']不是有效对象——它要么是null(上游查询未找到对应数据),要么是数组格式(而非对象),甚至可能不存在这个数组键。
解决步骤
1. 先确认变量真实结构
在报错代码前添加调试代码,明确$result['accm_sys_detail']的实际值:
@php dd($result['accm_sys_detail']); // 输出变量结构,刷新页面查看具体内容 @endphp
- 如果输出
null:检查上游获取accm_sys_detail的逻辑,确保查询能返回有效数据(比如用Eloquent的firstOrFail()替代first(),或者提前处理空数据场景)。 - 如果输出是数组:把
$result['accm_sys_detail']->AccmId改成数组访问语法$result['accm_sys_detail']['AccmId']。
2. 添加防御性代码避免报错
不管上游逻辑如何,先做存在性和类型判断,再执行查询:
@php $accmId = null; // 先判断变量存在且是对象 if (isset($result['accm_sys_detail']) && is_object($result['accm_sys_detail'])) { $accmId = $result['accm_sys_detail']->AccmId; } // 仅当$accmId有效时添加查询条件 $package_banner_data = DB::table('accm_sys_media') ->where('media_type', 5) ->when($accmId, function ($query) use ($accmId) { $query->where('AccmId', $accmId); }) ->get(); @endphp
3. 优化上游数据获取逻辑
如果$result['accm_sys_detail']是通过Eloquent查询得到的,建议:
- 若必须获取到数据才继续,用
firstOrFail()替代first(),查询为空时会抛出404,提前阻断错误流程。 - 若允许空数据,提前处理空场景,比如:
$accmSysDetail = AccmSysDetail::where(...)->first(); $result['accm_sys_detail'] = $accmSysDetail ?? new \stdClass(); // 空时赋值空对象,避免后续属性访问报错
内容的提问来源于stack exchange,提问作者sk-tech-linux
相关产品推荐
相关产品推荐

