問題点
ループの最終項目のはずなのだが、$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なことがどのように実装されているのか、具体的に調べないとわからん。時間が無いので誰か知ってたら教えて下さい。