← Back to Modules

Interactive Demo

🎯 Interactive Demo

The N+1 Query Problem

One of the most common performance killers in Laravel applications. Watch how query count explodes!

Without Eager Loading

Module::take(5)->get() then $module->lessons in loop

$modules = Module::take(5)->get();

foreach ($modules as $module) {
    echo $module->lessons->count();
    // ⚠️ Triggers a new query!
}
Total Queries: 4
Execution Time: 10.59ms

Queries Executed:

Query 1:
select * from `modules` limit 5
Time: 0.39ms
Query 2:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 7.23ms
Query 3:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 1.03ms
Query 4:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 0.42ms

With Eager Loading

Module::with('lessons')->take(5)->get()

$modules = Module::with('lessons')
    ->take(5)->get();

foreach ($modules as $module) {
    echo $module->lessons->count();
    // ✅ No query! Already loaded
}
Total Queries: 6
Execution Time: 2.89ms

Queries Executed:

Query 1:
select * from `modules` limit 5
Time: 0.39ms
Query 2:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 7.23ms
Query 3:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 1.03ms
Query 4:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 0.42ms
Query 5:
select * from `modules` limit 5
Time: 0.27ms
Query 6:
select * from `lessons` where `lessons`.`module_id` in (1, 2, 3) order by `order` asc
Time: 1.04ms

📊 Performance Improvement

-2
Fewer Queries
7.7ms
Time Saved
72.7%
Faster

💡 Key Takeaways

  • N+1 Problem: Accessing relationships in a loop triggers individual queries for each item
  • Solution: Use with() to eager load relationships upfront
  • Impact: Can reduce queries from hundreds to just 2-3, massively improving performance
  • Detection: Use Laravel Debugbar or enable Model::preventLazyLoading() in development