If your Laravel queries are starting to look messy, repeated, or hard to maintain, you’re not alone. Most projects eventually hit this wall where Eloquent logic is scattered across controllers, services, or even views.
This is exactly where Query Scopes become a game changer. They help you turn repetitive query logic into clean, reusable, and expressive methods.
Why Query Scopes Matter
Without scopes, your code often looks like this:
$users = User::where('is_active', 1)
->whereNotNull('email_verified_at')
->where('role', 'admin')
->get();
Now imagine repeating similar filters across multiple controllers. That’s when things get:
- Hard to maintain
- Easy to duplicate
- Difficult to debug
Query Scopes solve this by centralizing your query logic inside the model.
What Are Query Scopes in Laravel?
Laravel Query Scopes are methods defined inside a model that allow you to reuse query constraints.
There are two types:
- Local Scopes
- Global Scopes
1. Local Scopes (Most Common & Useful)
Local scopes let you define reusable query parts inside a model.
Example: Active Users Scope
class User extends Model
{
public function scopeActive($query)
{
return $query->where('is_active', 1);
}
}
Usage:
$users = User::active()->get();
Now your query becomes:
- Cleaner
- Reusable
- Easier to read
Scopes with Parameters
public function scopeRole($query, $role)
{
return $query->where('role', $role);
}
Usage:
$admins = User::active()->role('admin')->get();
Real-World Example (Production Style)
class Order extends Model
{
public function scopePaid($query)
{
return $query->where('status', 'paid');
}
public function scopeThisMonth($query)
{
return $query->whereMonth('created_at', now()->month);
}
}
Usage:
$orders = Order::paid()->thisMonth()->get();
This is how clean production queries should look.
2. Global Scopes (Automatic Filters)
Global scopes apply automatically to every query.
Example: Only Active Users Everywhere
use Illuminate\Database\Eloquent\Builder;
class ActiveScope implements \Illuminate\Database\Eloquent\Scope
{
public function apply(Builder $builder, Model $model)
{
$builder->where('is_active', 1);
}
}
Apply in Model:
class User extends Model
{
protected static function booted()
{
static::addGlobalScope(new ActiveScope);
}
}
Now every query automatically filters active users.
How Query Scopes Improve Code Quality
Without scopes:
- Logic scattered everywhere
- Hard to refactor
- Repeated conditions
With scopes:
- Centralized logic
- Cleaner controllers
- Easier testing
- Better readability
Visual Understanding
Without Scopes:
Controller → messy query → repeated logic → hard maintenance
With Scopes:
Controller → clean call → model handles logic → reusable system
Combining Scopes (Power Move)
User::active()
->role('admin')
->latest()
->get();
This is where Laravel Eloquent becomes really expressive.
Best Practices
- Keep scope logic simple and focused
- Use meaningful names (active, paid, verified)
- Avoid heavy business logic inside scopes
- Combine scopes instead of duplicating queries
- Prefer local scopes unless global filtering is required


0 Komentar