Laravel框架Blade模板foreach内空数据提示不显示问题排查
问题根源
你把无数据提示的判断逻辑写在了@foreach循环内部,当数据库未查询到对应数据时,Player::where('account_id', $id)->get()返回的是空的Illuminate\Support\Collection集合对象,此时@foreach不会进入循环体,内部的分支逻辑永远不会被触发,自然就看不到无数据提示。
修复方案
方案1:使用Blade原生的@forelse指令(推荐)
Laravel专门提供了@forelse指令处理「有数据则循环、无数据则走空状态分支」的场景,直接替换原有@foreach逻辑即可:
<h1 class="text-light">我的角色</h1> @forelse ($user as $u) <h1 class="text-light">{{ $u->name }}</h1> @empty <h1 class="text-light">未查询到任何数据!</h1> @endforelse
如果你的业务确实需要过滤name为空的记录,可以在循环内再加对应的@if判断,不影响空集合的提示逻辑。
方案2:先判断集合是否为空再执行循环
如果你更习惯使用@foreach写法,可以先判断返回的集合是否为空:
<h1 class="text-light">我的角色</h1> @if ($user->isEmpty()) <h1 class="text-light">未查询到任何数据!</h1> @else @foreach ($user as $u) @if ($u->name !== "") <h1 class="text-light">{{ $u->name }}</h1> @endif @endforeach @endif
可选优化建议
控制器中查询返回的是Player模型的集合,当前变量命名为$user容易和用户模型混淆,建议调整命名增强代码可读性:
public function mycharacters() { $players = Player::where('account_id', Auth::id())->get(); return view('user.characters')->with('players', $players); }
调整后Blade模板中对应的变量名同步修改为$players即可。
内容的提问来源于stack exchange,提问作者Teodor
相关产品推荐
相关产品推荐

