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, 2026•1 min read•ssbhattarai
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();