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テンプレートを実現してください!
参考: