LoginSignup
2
2

More than 3 years have passed since last update.

Laravel/Bladeのループ変数 $loop->last の判定が失敗する件

Last updated at Posted at 2019-08-06

問題点

ループの最終項目のはずなのだが、$loop->last がfalseになる。

暫定結論

QueryBuilderのような、Iterableだがcountが不明な変数をforeachに渡したときは、$loop->lastが使えない

blade.php
{{-- これは意図通り動かない --}}
@foreach($queryBuilder->cursor() as $item)
  @if($loop->last) 食事っておいしいよにゃー @endif
@endforeach

{{-- これは意図通り動く --}}
@foreach($someArray as $item)
  @if($loop->last) ラストエンペラー @endif
@endforeach

{{-- これは意図通り動く --}}
@foreach($queryBuilder->cursor() as $item)
  @if($loop->iteration == $queryBuilder->count()) 子門モサド @endif
@endforeach

詳細

PDFの出力で、最後のページだけ「改ページしない」が下記の要領で実装されていたんだけど、うまく動いていない。

blade.php
{{-- NG(最終行にもpage-breakが出力されてしまう) --}}
<div class="row @if(!$loop->last) page-break @endif">

画面に出力してみたら、最終行でも、$loop->lastがfalseになっておる。
なぜ???

仮説

ちょっと戸惑ったものの、よく考えてみると、foreachにクエリビルダを渡していることに気づいた。

blade.php
@foreach($queryBuilder->cursor() as $item)

foreachに配列やコレクションを渡したときは意図した通り動いているので、
予め件数がわかっていないと判定できないのかな?と考えて、下記の要領に変更したら、意図通り動作した。

blade.php
{{-- OK(最終行には出力されない) --}}
<div class="row @if($loop->iteration != $queryBuilder->count()) page-break @endif">

ただ、$loop->last が想定通りの値にならない正確な理由は未検証。
・予め件数がわかっていないとNG

というのはちょっと曖昧なので、$loopの実装と、クエリビルダ側でIteratorableなことがどのように実装されているのか、具体的に調べないとわからん。時間が無いので誰か知ってたら教えて下さい。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2