Blade循环仅推荐@foreach和@forelse;@forelse用于处理null、空数组或空Collection,避免报错并支持@empty分支;$loop变量提供索引、轮次、首尾等状态,嵌套时需手动保存外层状态。

Blade 循环只有 @foreach 和 @forelse 两种可用,其他如 @for、@while 虽存在但不推荐 —— 它们没有 $loop 支持,易出错,且违背模板层职责。
什么时候必须用 @forelse 而不是 @foreach
当你传入的数据可能为 null、空数组或空 Collection 时,@forelse 是唯一安全的选择。它自动检测“空”并跳过循环体,直接进入 @empty 分支。
-
@foreach($users as $user)遇到null会直接报错:Invalid argument supplied for foreach() -
@forelse($users as $user)在$users为空时静默跳过,执行@empty块(比如显示「暂无用户」) - 别写
@if($users->count()) @foreach(...) @endif—— 多一次count()调用,且$users是数组时会报错(count()不支持数组调用) -
@empty只对null、[]、空Collection生效;若传入字符串""或数字0,@forelse仍会尝试遍历(PHP 行为),所以务必确保控制器传的是数组或Collection
$loop 变量怎么用才不踩坑
$loop 是每个 @foreach 内自动可用的隐式变量,提供当前迭代状态。它不是全局对象,不能跨嵌套循环复用。
-
$loop->index:从 0 开始的索引(等价于 PHP 的$i) -
$loop->iteration:从 1 开始的轮次(更常用,比如显示「第 1 条」) -
$loop->first/$loop->last:布尔值,判断是否首/尾项(注意:单条数据时两者都为true) -
$loop->odd/$loop->even:按$loop->iteration判断奇偶(不是$loop->index) - 嵌套循环中,内层
$loop覆盖外层,如需访问外层状态,得提前赋值到变量,比如@php $outerIndex = $loop->index; @endphp
@foreach 传参和变量命名的硬约束
Blade 不解析 PHP 表达式,所有数据必须在控制器中准备好,不能在模板里调用方法或构造集合。
- ✅ 正确:
return view('posts.index', ['posts' => Post::latest()->get()]);,模板中@foreach($posts as $post) - ❌ 错误:
@foreach(Post::all() as $post)—— Blade 不执行Post::all(),只会当字符串处理或报错 -
$post是当前项变量名,可任意取(如$p、$item),但禁止与外层同名(比如@foreach($posts as $posts)会导致覆盖) - 传入非可遍历类型(如
string、int、stdClass)会触发Invalid argument supplied for foreach() - 如果不确定数据类型,可在控制器中强转:
collect($data)->filter()->values()确保是Collection
最常被忽略的一点:Blade 编译缓存会让模板修改不生效,循环逻辑改了但页面没变?先跑 php artisan view:clear。另外,$loop 在 @forelse 中同样可用,但 @empty 块内不可用 —— 因为那里根本没在循环。











