Laravel中读取null对象created_at报错,@forelse无效如何解决?
问题原因
你遇到的错误是因为控制器中$dataBumps[] = ...->first();的写法,不管查询是否返回结果,都会向数组中添加一个元素——如果没有匹配数据,这个元素就是null。此时$dataBumps数组并非空数组,所以@forelse的@empty分支不会触发,循环时访问null->created_at就会抛出错误。
解决方案
方案1:修改控制器,仅在有数据时添加到数组
调整控制器代码,只在查询到结果时才将数据存入数组:
$latestLike = DB::table('server_user_likes') ->where('server_id', $server->id) ->orderBy('created_at', 'DESC') ->first(); if ($latestLike) { $dataBumps[] = $latestLike; }
这样当没有数据时,$dataBumps是空数组,@forelse会进入@empty分支显示-。
方案2:在Blade模板中增加空值判断
如果不想修改控制器,可以在模板中使用PHP的null安全运算符和空合并运算符,直接处理可能的null值:
@forelse ($dataBumps as $dataBump) {{ $dataBump?->created_at ?? '-' }} @empty - @endforelse
$dataBump?->created_at会在$dataBump为null时直接返回null,再通过?? '-'将null替换为-。
方案3:直接传递单个结果(更简洁)
从代码看你只需要最新的一条记录,没必要用数组存储。可以直接传递单个对象到模板:
控制器代码:
$dataBump = DB::table('server_user_likes') ->where('server_id', $server->id) ->orderBy('created_at', 'DESC') ->first();
Blade模板代码:
{{ $dataBump?->created_at ?? '-' }}
这种写法更贴合你的业务需求,避免了数组带来的冗余判断。
内容的提问来源于stack exchange,提问作者CARSAR
相关产品推荐
相关产品推荐

