LaravelのBladeテンプレートエンジンは、視認性が高く記述性にも優れています。特に繰り返し処理(ループ)は、PHPのネイティブ構文に似たディレクティブが用意されており、直感的に書くことができます。また、@forelseや@eachなど、Blade特有の強力な機能も提供され、より柔軟で美しいコードが可能です。
本記事では、Laravelの最新バージョン(2024年時点で10系)で有用なBladeの繰り返しディレクティブを網羅的に解説します。基本的な使い方はもちろん、$loop変数による制御や、@break/@continueディレクティブ、さらに@eachを活用したパーシャルビューの描画なども取り上げます。
初心者から中上級者まで、「Laravel Blade 繰り返し」で必要な情報が全てここにある、そんな記事を目指しました。
Bladeで使える繰り返し系ディレクティブ一覧
Bladeでは、以下のディレクティブが利用可能です。
@for:PHPのfor文と同等@foreach:PHPのforeach文と同等@forelse:foreachにemptyの概念を持たせた便利なディレクティブ@while:PHPのwhile文と同等@each:特定のテンプレートを繰り返し描画するディレクティブ(パーシャルビューの繰り返しに便利)
また、繰り返し中に利用可能な$loop変数(後述)や、ループ中断用の@break、特定条件で次のループへスキップする@continueなど、補助的なディレクティブも用意されています。
@for ディレクティブ
@forはPHPのfor文とほぼ同一の使い勝手です。インデックスを利用したループ処理に適しています。
例:
@for ($i = 0; $i < 5; $i++)
<p>No.{{ $i }}</p>
@endfor
上記はNo.0からNo.4までを表示します。
@foreach ディレクティブ
@foreachはPHPのforeach文と同等です。配列やコレクションを簡潔に反復処理します。
例:
@php
$datas = [
1 => 'Apple',
2 => 'Banana',
3 => 'Cherry',
];
@endphp
@foreach ($datas as $key => $data)
<p>key:{{ $key }} data:{{ $data }}</p>
@endforeach
@forelse ディレクティブ
@forelseはforeachと似ていますが、特筆すべき点は「空時の処理」をシンプルに記述できることです。@forelse ~ @empty ~ @endforelseの構造で、配列が空の場合@emptyブロックの中身を表示します。
例:
@php
$items = [];
@endphp
@forelse ($items as $item)
<p>{{ $item }}</p>
@empty
<p>アイテムがありません。</p>
@endforelse
$itemsが空配列なので、@emptyブロックが表示されます。
@while ディレクティブ
@whileはPHPのwhile文と同一です。条件が真の間ループを続けます。
例:
@php
$count = 0;
@endphp
@while ($count < 3)
<p>ループカウント:{{ $count }}</p>
@php $count++; @endphp
@endwhile
@each ディレクティブ(レンダービュー)
@eachは、指定したビューを配列やコレクションの要素ごとにレンダリングするためのディレクティブです。
3つ以上の引数を取り、以下の構造になります。
@each('ビュー名', $ループ対象, 'ループ毎の変数名', '空時のビュー(任意)')
ポイント
$namesなどループ対象の配列(またはコレクション)を指定'name'が各ループ内での変数名になる- 第4引数に空時用のビューを指定すると、配列が空の際にそのビューがレンダリングされます
@eachで読み込まれるビューテンプレートは、「親ビューから変数を継承しない」点に注意が必要です。必要な変数はあらかじめ渡すか、サービスコンテナやViewComposerで用意します。
例:
@php
$names = ['佐藤', '鈴木', '高橋'];
@endphp
@each('partials.loop_each', $names, 'name')
partials.loop_each.blade.php(ループ毎に表示するパーシャル例):
<li>{{ $name }}</li>
出力結果:
<li>佐藤</li>
<li>鈴木</li>
<li>高橋</li>
配列が空の場合の例:
@php
$names = [];
@endphp
@each('partials.loop_each', $names, 'name', 'partials.loop_each_empty')
partials.loop_each_empty.blade.phpが表示されます:
<p>名前は一件もありません。</p>
繰り返し制御用ディレクティブ:@break / @continue
Laravel Bladeでは、ループを制御するための@break、@continueディレクティブも用意されています。
PHPのbreak、continueと同様に動作しますが、Blade上でもスッキリ記述できます。
@break例:
@foreach ($datas as $data)
@if ($data === 'stop')
@break
@endif
<p>{{ $data }}</p>
@endforeach
$dataが'stop'になったらループを中断します。
@continue例:
@foreach ($datas as $data)
@if ($data === 'skip')
@continue
@endif
<p>{{ $data }}</p>
@endforeach
$dataが'skip'の場合、その回の表示をスキップします。
ループ変数($loop)の活用法
Bladeの@foreachや@forelseでは、特別なループ変数$loopが利用できます。$loopには以下のプロパティが存在します。
| プロパティ | 説明 |
|---|---|
| $loop->index | 現在のループインデックス(0開始) |
| $loop->iteration | 現在のループ繰り返し数(1開始) |
| $loop->remaining | ループの残り回数 |
| $loop->count | 全ループ件数 |
| $loop->first | 最初のループ要素の場合true、それ以外false |
| $loop->last | 最後のループ要素の場合true、それ以外false |
| $loop->depth | ループのネスト深度 |
| $loop->parent | 親ループの$loop変数 |
例:
@foreach ($datas as $data)
@if ($loop->first)
<p>最初の要素です!</p>
@endif
<p>{{ $loop->iteration }}回目: {{ $data }}</p>
@if ($loop->last)
<p>最後の要素でした!</p>
@endif
@endforeach
複雑な入れ子ループでも、$loop->depthや$loop->parentを使えば、親ループの情報にアクセスできます。
パフォーマンス・注意点
- 繰り返し中に複雑なビジネスロジックを書くよりも、コントローラでデータを整形しておき、Blade側は表示ロジックに専念することがおすすめです。
@each使用時は、親テンプレートから変数が引き継がれない点に注意。必要な値は直接ビューに渡すか、ViewComposerを利用しましょう。- 大量のデータを
foreachする場合、事前にデータをキャッシュしておく、もしくはEager LoadingでN+1問題を回避するなど、データ取得面での工夫も重要です。
まとめ
LaravelのBladeディレクティブは、PHPの標準的な繰り返し構文を踏襲しつつ、@forelseや@eachといったLaravel固有の機能で、より優雅に、より柔軟にテンプレートを記述できる力を与えてくれます。
- 基本は
@for、@foreach、@whileでOK - 空データ対応なら
@forelse - 部分ビューの再利用なら
@each - ループ中断やスキップは
@break・@continue $loop変数でループ情報を簡易取得
これらを駆使すれば、Bladeテンプレートでの繰り返し処理がより洗練され、保守性も向上します。この記事を参考に、よりクリーンで見通しの良いBladeテンプレートを実現してください!
参考:
