| この記事の要点 |
|
Laravel の Blade テンプレートで使用する繰り返し(for 文)に関する記事です。各ディレクティブの書き方、$loop 変数、よくあるミスをまとめます。
構文の一覧
| ディレクティブ | 用途 | $loop 変数 |
|---|---|---|
@for ... @endfor | 回数が決まっている繰り返し(1〜10 の数字を出すなど) | 使えない |
@foreach ... @endforeach | 配列・コレクションの全要素を順に処理 | 使える |
@forelse ... @empty ... @endforelse | foreach + 「0 件だった場合」の表示 | 使える |
@while ... @endwhile | 条件が真の間繰り返す | 使えない |
基本の書き方
@for ($i = 0; $i < 10; $i++)
現在の値は: {{ $i }}
@endfor
@foreach ($users as $user)
<p>これは {{ $user->id }} ユーザーです。</p>
@endforeach
@forelse ($users as $user)
<li>{{ $user->name }}</li>
@empty
<p>ユーザーなし</p>
@endforelse
@while (true)
<p>無限ループ中</p>
@endwhile
最後の @while (true) は構文の例で、実際に書くと終わらずにタイムアウトします。@while を使うときは、ループ内で必ず条件が偽になるように変数を変化させます。
キーと値の両方を使う
@foreach ($prices as $name => $price)
<tr>
<td>{{ $name }}</td>
<td>{{ number_format($price) }} 円</td>
</tr>
@endforeach
$loop 変数で「何回目か」「最後か」を判定する
@foreach と @forelse の中では、Blade が自動で $loop という変数を用意します。カンマ区切りの最後だけカンマを付けない、最初の行だけ強調する、といった処理を自前のカウンタなしで書けます。
| プロパティ | 意味 |
|---|---|
$loop->index | 0 から始まる番号 |
$loop->iteration | 1 から始まる番号 |
$loop->remaining | 残りの回数 |
$loop->count | 全体の要素数 |
$loop->first / $loop->last | 最初 / 最後の要素なら true |
$loop->even / $loop->odd | 偶数回目 / 奇数回目なら true(iteration 基準) |
$loop->depth | ネストの深さ(一番外側が 1) |
$loop->parent | ネストしたループで、外側のループの $loop |
@foreach ($tags as $tag)
<span @class(['tag', 'tag-first' => $loop->first])>{{ $tag->name }}</span>@if (! $loop->last), @endif
@endforeach
@foreach ($categories as $category)
@foreach ($category->items as $item)
{{ $loop->parent->iteration }}-{{ $loop->iteration }}: {{ $item->name }}
@endforeach
@endforeach
途中で飛ばす・抜ける(@continue / @break)
@foreach ($users as $user)
@continue($user->is_banned) {{-- 条件が真ならこの回を飛ばす --}}
<li>{{ $user->name }}</li>
@break($loop->iteration >= 5) {{-- 5 件表示したら抜ける --}}
@endforeach
@if ... @continue ... @endif と書くこともできますが、引数に条件を書く形の方が短く読みやすくなります。ただし「最初の 5 件だけ表示」が目的なら、ビューではなくコントローラ側で take(5) や limit(5) で絞る方が無駄なデータを取得しません。
部分テンプレートを繰り返す(@each)
{{-- 各要素を views/users/item.blade.php に $user として渡す。0 件なら users/empty を表示 --}}
@each('users.item', $users, 'user', 'users.empty')
@each で読み込んだ部分テンプレートは親ビューの変数を引き継がないため、親の変数も使いたい場合は @foreach の中で @include を使います。
よくある落とし穴
- N+1 クエリ:
@foreach ($posts as $post) {{ $post->user->name }}のようにループ内でリレーションを参照すると、件数分の SQL が発行される。コントローラでPost::with('user')->get()として事前に読み込む $loopは @for / @while では使えない: 使うと「Undefined variable $loop」になる- 閉じ忘れ:
@endforeachなどを忘れると、エラーの行番号がずれた位置で「syntax error, unexpected end of file」になる - エスケープ:
{{ }}は自動で HTML エスケープされる。{!! !!}はエスケープしないので、利用者が入力した値には使わない - null を渡す:
$usersが null だと foreach でエラーや警告になる。コントローラで必ず配列かコレクションを渡すか、@forelseと組み合わせて$users ?? []とする
確認方法
- 想定どおりのデータが渡っているかは、ループの前に
@dump($users)を置いて確認できる(確認後は必ず削除) - Blade がどんな PHP に変換されたかは
storage/framework/viewsのコンパイル済みファイルで見られる。表示が古いままならphp artisan view:clear
関連
子ページ
子ページはありません
同階層のページ
- 親ビューと子ビュー(@section, @yield, @extends, @parent, @include)
- 条件分岐(@if)
- 繰り返し(@for, @foreach, @forelse, @while)
- 個別のページにcssやjsを反映させる方法
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38