laravel 中没有叫 loop 的独立“循环语法”,真正起作用的是 blade 的 @foreach、@for、@while 及 eloquent 集合的 each、map、filter 等方法;@foreach 必须配对 @endforeach,需判空防报错,嵌套时 $loop 仅作用于当前层,each 不生成新集合而 map 返回新集合。

直接说结论:Laravel 中没有叫 loop 的独立“循环语法”,真正起作用的是 Blade 模板里的 @foreach、@for、@while,以及 Eloquent 集合上的 each、map、filter 等方法——它们才是你日常写循环时实际调用的工具。
Blade 里怎么写 foreach 才不踩坑
很多人在 Blade 中写 @foreach 时直接套用 PHP 原生写法,结果遇到空数组报错、变量未定义、嵌套层级混乱等问题。
-
@foreach必须配对@endforeach,漏掉会导致模板解析失败,错误信息通常是Undefined variable: __env或页面空白 - 遍历集合前建议先判空:
@if($users->isNotEmpty()) @foreach($users as $user) ... @endforeach @endif,避免Invalid argument supplied for foreach() - 别在
@foreach内部直接修改原集合(比如$users->push(...)),Blade 渲染时会用到原始数据快照,运行时修改无效 - 需要索引或键值时,用
@foreach($items as $index => $item),注意$index是数字索引;如果是关联数组,$index就是键名
Eloquent 集合的 each 和 map 有什么区别
很多人以为 each 和 map 都是“循环执行”,但它们语义和返回值完全不同,混用容易引发逻辑错误。
-
each()是就地遍历,不生成新集合,返回原集合本身(链式调用可用),适合做副作用操作,比如发通知、记录日志:$users->each(fn($u) => $u->notify(new WelcomeNotification())); -
map()返回一个全新集合,原集合不变,适合转换数据:$names = $users->map(fn($u) => $u->name)->all(); -
filter()也是返回新集合,但只保留满足条件的项:$activeUsers = $users->filter(fn($u) => $u->active); - 所有这些方法都支持链式调用,但要注意顺序:先
filter再map比反过来更高效,避免对大量无效数据做无谓转换
什么时候该用 for / while 而不是 foreach
Blade 提供了 @for 和 @while,但它们使用场景非常有限,多数时候是 @foreach 的冗余替代。
-
@for只适用于已知次数的数值循环,比如生成 1–10 的下拉选项:@for($i = 1; $i {{ $i }} @endfor -
@while容易失控,Blade 不提供类似 PHP 的break或continue,一旦条件永远为真,页面会卡死或超时,基本不推荐在模板中使用 - 如果业务逻辑需要复杂控制流(如“跳过前三条”“每三条加一个分隔线”),优先在控制器里预处理好数据,而不是在 Blade 里堆砌
@if+@for - 模板层越简单越好——循环逻辑尽量下沉到模型或服务类,Blade 只负责展示
真正容易被忽略的点是:Blade 的循环变量(如 $loop)只在 @foreach 内有效,且它不是 PHP 的 stdClass,而是一个 Laravel 封装的 Illuminate\Support\Fluent 实例。它的属性如 $loop->first、$loop->last、$loop->iteration 看似简单,但如果你在嵌套 @foreach 中没注意作用域,很容易误用外层的 $loop 去判断内层逻辑。











