You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:32:50