Laravel: Use when() to Avoid Ugly Conditional Queries

Laravel’s when() method to write clean conditional queries, avoid messy if-statements, and build dynamic filters for search, APIs, and advanced query logic.

February 2, 20261 min readssbhattarai

Instead of wrapping queries in messy if statements, use Laravel’s when() method to keep your queries fluent and readable.

The Ugly Way

$query = User::query();

if ($request->role) {
    $query->where('role', $request->role);
}

if ($request->active) {
    $query->where('is_active', true);
}

$users = $query->get();

 

The Clean Laravel Way

$users = User::query()
    ->when($request->role, fn ($q, $role) =>
        $q->where('role', $role)
    )
    ->when($request->active, fn ($q) =>
        $q->where('is_active', true)
    )
->when($request->q, fn ($q, $search) =>
        $q->where('name', 'like', "%{$search}%")
    )
    ->get();

Why This Matters

  • Keeps queries readable
  • Avoids nested condition hell
  • Perfect for filters & search APIs
  • Scales cleanly as logic grows

Pro Tip: Add a Default Fallback with when()’s Third Argument

$users = User::query()
    ->when(
        $request->sort,
        fn ($q, $sort) => $q->orderBy($sort),
        fn ($q) => $q->orderBy('created_at', 'desc') // default fallback
    )
    ->get();