Stop bloating your database logs. Learn how to proactively detect and solve the N+1 query trap in Laravel using preventLazyLoading to cut page load times by up to 80% and ensure a scalable, high-performance application.
The “N+1” problem occurs when your application executes one query to fetch a list (1) and then a separate query for every single item in that list (N) to retrieve a relationship. By disabling lazy loading, you force your application to use Eager Loading, collapsing dozens of redundant requests into just two optimized queries.
Implementation: Zero-Tolerance for Lazy Loading
To stop this performance leak, you can instruct Laravel to throw an exception the moment it detects a lazy load during development.
1. Configure the Provider
Open app/Providers/AppServiceProvider.php and locate the boot() method. This is where global framework behaviors are defined.
2. Add the Prevention Logic
Add the following line to ensure the app “screams” at you during local development but remains stable in production:
use Illuminate\Database\Eloquent\Model;
public function boot(): void
{
// Disable lazy loading only when NOT in production
Model::preventLazyLoading(! app()->isProduction());
}
3. Resolve the Violation
When you encounter a LazyLoadingViolationException, simply update your Eloquent call to include the with() method.
The Impact: Lazy vs. Eager Loading
The difference in database “chatter” is massive, often reducing page load times by 60-80% on data-heavy views.
| Approach | Logic | Query Count (for 50 items) |
| Lazy Loading | Fetch posts, then fetch each author one-by-one inside a loop. | 51 Queries |
| Eager Loading | Fetch all posts, then fetch all related authors in one batch. | 2 Queries |
Code Comparison
The “N+1” Trap (Avoid This)
// Controller
$posts = Post::all(); // Triggers 1 query
// Blade View
@foreach($posts as $post)
<span>{{ $post->author->name }}</span> {{-- Triggers 50 separate queries! --}}
@endforeach
The Optimized Way (Eager Loading)
By using with(), Laravel uses a WHERE IN clause behind the scenes (e.g., SELECT * FROM users WHERE id IN (1, 2, ... 50)).
// Controller
// 1 Query for posts + 1 Query for all related authors
$posts = Post::with('author')->limit(50)->get();
// Blade View
@foreach($posts as $post)
<span>{{ $post->author->name }}</span> {{-- No query triggered; data is in memory --}}
@endforeach
