| この記事の要点 |
|
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・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09