Laravel 8中如何检查集合是否为空?解决视图获取非对象属性报错问题
解决 "Trying to get property 'column_thirteen' of non-object" 错误
这个错误的核心原因很明确:当你的查询用first()没有找到匹配的记录时,它会返回null,而不是一个Report对象。此时视图里直接尝试访问$p_report->column_thirteen,就相当于在访问null的属性,自然会抛出错误。
下面是几种可行的解决方法,你可以根据自己的需求选择:
方法一:在控制器层面确保$p_report始终是对象
你可以在控制器里处理空结果,要么创建一个空的Report实例,要么用Laravel提供的快捷方法:
方式A:手动判断并创建空实例
public function reportDetail(Request $request) { $p_report = Report::office()->where('created_at','>=',Carbon::now()->subdays(60))->first(['column_thirteen', 'column_fourteen']); // 如果没有找到记录,初始化一个空的Report对象 if (!$p_report) { $p_report = new Report(); } return view('acland.report.report_detail', compact('p_report')); }
方式B:使用firstOrNew()快捷方法
firstOrNew()会返回匹配的第一条记录,如果没有匹配则创建一个新的模型实例:
public function reportDetail(Request $request) { $p_report = Report::office() ->where('created_at','>=',Carbon::now()->subdays(60)) ->firstOrNew(); // 不需要传参数,默认创建空实例 return view('acland.report.report_detail', compact('p_report')); }
方法二:在视图层面安全检查属性访问
如果你不想修改控制器,也可以在视图里先确认$p_report不是null,再访问它的属性。这里有两种写法:
方式A:先判断$p_report是否存在
@if ($p_report && $p_report->column_thirteen !== null) <td style="border: 1px solid black" class="input_bangla" id="column_one"> {{ $p_report->column_thirteen }} <input type="hidden" name="column_one" value="{{ $p_report->column_thirteen }}"> </td> @else <td style="border: 1px solid black" class="input_bangla"> <input type="text" name="column_one" id="column_one" class="form-control" style="min-width: 100px"> </td> @endif
方式B:使用optional()辅助函数
Laravel的optional()函数可以安全访问对象属性,如果对象是null,会返回null而不是报错:
@if (optional($p_report)->column_thirteen !== null) <td style="border: 1px solid black" class="input_bangla" id="column_one"> {{ optional($p_report)->column_thirteen }} <input type="hidden" name="column_one" value="{{ optional($p_report)->column_thirteen }}"> </td> @else <td style="border: 1px solid black" class="input_bangla"> <input type="text" name="column_one" id="column_one" class="form-control" style="min-width: 100px"> </td> @endif
额外建议
如果你的业务逻辑中,这个报告记录应该存在,那你可能需要排查为什么查询没有返回结果:
- 检查
office()scope的逻辑是否正确 - 确认数据库中是否有符合
created_at >= 60天前条件的记录 - 可以在控制器里用
dd($p_report)临时输出查询结果,确认是否获取到了数据
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

