@foreach ディレクティブの使い方
Laravel で Blade ファイルを編集するときにお世話になる @foreach ディレクティブ。コントローラから、記事情報を受け取って、Blade ファイル内で記事情報の展開をする際などに使用されます。例えば、以下のようなコードです。
<div class="article-box">
@foreach( $articles as $article )
<div class="card">
<h3>{{ $article->title }}</h3>
<p>{{ $article->content }}</p>
<small>{{ $article->author }}</small>
</div>
@endforeach
</div>
このように、@foreach は コントローラから受け取った記事情報 $articles を反復処理して使用できるように、1記事あたりの情報を、$article としてループさせています。
とても便利な @foreach ディレクティブですが、少々弱点もあります。例えば、コントローラから受け取った $articles 内に、何も記事情報がなかった場合はどうでしょうか? その場合、@foreach 内にネストされたコードは実行されません(記事情報がないのですから当たり前と言ってしまえば当たり前です)。
記事情報が出力されない場合($articles に記事情報がなかった場合)に備えて、@foreach ディレクティブを使用する際は、一緒に @if ディレクティブを使用することをお勧めします。例えば、上記のコードを参考にするのであれば、記事情報がない場合に備えて以下のようにコードを記述します。
<div class="article-box">
// 記事情報があった場合
@foreach( $articles as $article )
<div class="card">
<h3>{{ $article->title }}</h3>
<p>{{ $article->content }}</p>
<small>{{ $article->author }}</small>
</div>
@endforeach
// 記事情報がなかった場合
@if( $articles->isEmpty() )
<p>No articles</p>
@endif
</div>
このように、$articles に記事情報がない場合でも、@ifの判定により、<p>No articles</p> とブラウザに出力され、Webサイトの利用者は、「記事がないんだな」と理解することができますね。
@forelse ディレクティブをお勧めする理由
・・・という感じで、@foreach の使い方について説明してきましたが、この @foreach と @if の組み合わせ を更に簡単、便利にした @forelse ディレクティブがあるのでご紹介したいと思います。使い方は簡単で、例として以下のコードをご覧ください。
<div class="article-box">
@forelse( $articles as $article )
<div class="card">
<h3>{{ $article->title }}</h3>
<p>{{ $article->content }}</p>
<small>{{ $article->author }}</small>
</div>
@empty
<p>No articles</p>
@endforelse
</div>
この @forelse ディレクティブは、もしも $articles の情報がない場合に備えて、@empty ディレクティブ以下に、記事情報がない場合に表示されるコードを記述できます。今回の例では、@empty と @endforelse の間の <p>No articles</p> が記事情報のない場合に出力されます。
このように、@forelse と @foreach を比較してみると、@forelse のほうがスッキリして見えてきませんでしょうか?
本記事で解説した例のコードでは、@foreach でも @forelse でも、出力される内容は変わりません。しかし、コードが見やすくする目的で @forelse を使用することをお勧めできれば良いなと思います。