如何修复Laravel中Trying to get property 'passing_grade' of non-object错误
错误修复方案
错误原因
该报错本质是代码尝试读取非对象类型变量的passing_grade属性,通常是控制器传递给视图的课程关联数据存在空值,比如已完成记录关联的课程数据被删除、关联关系未正确加载、存在脏数据导致关联查询返回null。
修复步骤
1. 控制器代码优化
优先在数据查询层做过滤,避免无效数据传递到视图:
// 示例:获取当前登录用户的已完成课程数据 $completedCourses = auth()->user()->courseCompletions() ->with('course') // 预加载关联的课程模型,passing_grade字段通常存储在课程表 ->whereHas('course') // 过滤掉关联课程不存在的脏数据 ->get(); return view('你的视图文件名', compact('completedCourses'));
额外排查点:
- 确认CourseCompletion模型中的course关联方法写法正确,返回
belongsTo(Course::class) - 若允许展示已软删的课程,可在with关联时追加
->withTrashed()
2. Blade视图层兼容
视图层增加空值判断,进一步避免异常:
@foreach($completedCourses as $completion) {{-- 空安全判断,避免非对象报错 --}} @isset($completion->course) <div class="course-card"> <h3>{{ $completion->course->title }}</h3> <p>合格分数线:{{ $completion->course->passing_grade }}分</p> <p>你的考核得分:{{ $completion->score }}分</p> {{-- 证书下载按钮,路由参数可根据你的业务逻辑替换为课程ID --}} <a href="{{ route('certificate.download', $completion->id) }}" class="download-btn">下载对应证书</a> </div> @endisset @endforeach
如果使用PHP7.4及以上版本,可直接用空安全运算符简化判断:{{ $completion?->course?->passing_grade }}
3. 补充证书下载路由
在routes/web.php中添加下载路由:
Route::get('certificate/download/{completion}', [CertificateController::class, 'download'])->name('certificate.download');
在CertificateController的download方法中实现证书生成、返回下载流的逻辑即可。
内容的提问来源于stack exchange,提问作者Hilmi
相关产品推荐
相关产品推荐

