Blog Post

Optimizing Queries in Laravel Eloquent

Laravel Eloquent is a powerful ORM (Object-Relational Mapping) system that allows you to interact with your database using PHP. However, as you scale ...

2025-10-03
3 min read
Avinash Tirumala

Optimizing Queries in Laravel Eloquent

Laravel Eloquent is a powerful ORM (Object-Relational Mapping) system that allows you to interact with your database using PHP. However, as you scale your application and databases, queries can become slow and inefficient. In this blog post, we'll cover the techniques to optimize queries in Laravel Eloquent.

Understanding Query Optimization

Query optimization is the process of writing efficient SQL queries that minimize database operations and optimize performance. In Eloquent, query optimization is crucial to ensure your application runs smoothly and scales well.

1. Using Eager Loading

Eager loading is a technique in Eloquent that preloads related models, reducing the need for multiple database queries. Here's an example:

// Model

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class User extends Model
{
    public function posts(): HasMany
    {
        return $this->hasMany(Post::class);
    }
}
// Controller

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use App\Models\Post;

class UserController extends Controller
{
    public function index(User $user)
    {
        // Eager loading related data
        $posts = $user->posts;

        return view('users.index', compact('user', 'posts'));
    }
}

2. Using Lazy Loading

Lazy loading is a technique in Eloquent that loads related data only when it's required. Here's an example:

// Model

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class User extends Model
{
    public function posts(): HasMany
    {
        return $this->hasMany(Post::class);
    }
}
// Controller

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use App\Models\Post;

class UserController extends Controller
{
    public function index(User $user)
    {
        // Lazy loading related data
        $post = $user->posts->first();

        return view('users.index', compact('user', 'post'));
    }
}

3. Using Collective Gangsta

Collective Gangsta is a package that provides various query builders to optimize your queries. One of its features is the exists method, which prevents unnecessary database operations.

// Model

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class User extends Model
{
    public function posts(): HasMany
    {
        return $this->hasMany(Post::class);
    }
}
// Controller

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use Collective GANGsta\Sharp\Eloquent\ builder

class UserController extends Controller
{
    public function index(User $user)
    {
        // Using Collective Gangsta's exists method
        if ($user->posts->exists) {
            return redirect()->route('users.index');
        }

        // Eager loading related data
        $posts = $user->posts;

        return view('users.index', compact('user', 'posts'));
    }
}

4. Using Caching

Caching is a technique in Eloquent that stores frequently accessed data in memory, reducing the need for database queries. Here's an example:

// Model

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades `\Cache`
use \Illuminate\Support\Str

class User extends Model
{
    public function cachedPosts()
    {
        // Check if data is cached
        $cacheKey = Str::random(10);

        if (\Cache::has($cacheKey)) {
            return \Cache::get($cacheKey);
        }

        // Fetch data from database
        $posts = $this->posts()->get();

        // Cache the data
        \Cache::put($cacheKey, $posts, 60);

        return $posts;
    }
}

5. Using Query Builders

Query builders are classes that provide methods to optimize and customize your queries. Here's an example:

// Model

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use \Illuminate\Database\Eloquent\Builder\QueryBuilder

class User extends Model
{
    public function query()
    {
        // Build a custom query
        $query = \DB::table('users')
            ->select('id', 'name')
            ->where('email', '=', \Request::get('email'))
            ->orderBy('created_at', 'desc')
            ->limit(10);

        return $query;
    }
}

Conclusion

Optimizing queries in Laravel Eloquent is crucial to ensure your application runs smoothly and scales well. By using eager loading, lazy loading, Collective Gangsta, caching, and query builders, you can optimize your queries and improve performance.

Enjoyed this article?

If you found this post helpful, consider sharing it with your network or subscribing to my newsletter for more insights.

Optimizing Queries in Laravel Eloquent - Avinash Tirumala | Avinash Tirumala