[9.x] Prevent calling count() on LazyCollection in Blade loops #39141
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
As described in #39003, looping over a
LazyCollection
using@foreach
in Blade causes the entire collection's iterator to be unwound. This causes duplicate queries and unnecessary model hydration when using lazy collections with Eloquent (because everything would be loaded into memory – twice).This change skips calling
count()
on lazy collections, which preserves its 'laziness' until actually looping over the items.This PR could be considered a breaking change (therefore targeted towards 9.x), because certain information on the loop variable is lost.
$loop->remaining
,$loop->count
, and$loop->last
will benull
after this change when looping over a lazy collection. If one would want to keep this behaviour, calling->collect()
on the lazy collection would mimic that.