DEV Community

Aleson França
Aleson França

Posted on

Optimizing Laravel Queries

If you are building applications with Laravel, query optimization is very important for performance. In this post, I will show you simple and practical tips to make your Laravel queries faster and more efficient.


Use Eager Loading

When you use relationships, always try to use with() to avoid the N+1 problem.

Bad Example

$users = User::all();
foreach ($users as $user) {
    echo $user->profile->bio;
}
Enter fullscreen mode Exit fullscreen mode

Good Example:

$users = User::with('profile')->get();
foreach ($users as $user) {
    echo $user->profile->bio;
}
Enter fullscreen mode Exit fullscreen mode

Select Only The Columns You Need

Always select only the fields you really need.

$users = User::select('id', 'name')->get();
Enter fullscreen mode Exit fullscreen mode

Use Chunk For Big Data

If you need to work with a large number of records, use chunk() to save memory.

User::chunk(100, function($users) {
    foreach ($users as $user) {
        // process user
    }
});
Enter fullscreen mode Exit fullscreen mode

Add Indexes in Your Database

If you use a column in WHERE, ORDER BY or JOIN, you should create an index to make the query faster.


Cache Expensive Queries

If you run the same query many times, use Laravel cache.

$users = Cache::remember('users.all', 60, function() {
    return User::all();
});
Enter fullscreen mode Exit fullscreen mode

Use when() for conditional queries

This makes your code cleaner and more readable.

$query = User::query();
$query->when($active, function($q) {
    return $q->where('status', 'active');
});
$users = $query->get();
Enter fullscreen mode Exit fullscreen mode

Use raw expressions carefully

Sometimes you need more complex queries. Use DB::raw(), but be careful with SQL injection.

$users = User::select(DB::raw('count(*) as user_count, status'))
              ->groupBy('status')
              ->get();
Enter fullscreen mode Exit fullscreen mode

Profile your queries

Use Laravel DebugBar or DB::listen() to see what queries are running.

DB::listen(function($query) {
    logger($query->sql);
});
Enter fullscreen mode Exit fullscreen mode

Use Pagination

When showing data in frontend, always use paginate() or cursorPaginate().

$users = User::paginate(15);
Enter fullscreen mode Exit fullscreen mode

Use exists() or count()

If you only need to know if a record exists, do not use get().

if (User::where('email', $email)->exists()) {
    // user exists
}
Enter fullscreen mode Exit fullscreen mode

Conclusion

With these simple tips, you can make your Laravel queries much faster and more efficient. Start applying them today in your project!

Top comments (0)