Dynamic Scopes - побудова складних фільтрів
Побудова фільтрів пошуку з купою if виразів? Код стає нечитабельним.
Dynamic scopes дозволяють чисто ланцюжити умови.
Патерн:
Кожен scope повертає query builder. Ланцюжи декількох scopes разом.
Просунута техніка:
Використовувати when() всередині scopes для опціональних умов.
Переваги:
- Повторне використання в контролерах
- Тестування ізольовано
- Читабельна побудова запитів
Порада: Створи базовий scope на якому можуть будуватися інші scopes.
// Модель User
public function scopeFilter($query, array $filters)
{
return $query
->when($filters['status'] ?? false,
fn($q, $status) => $q->where('status', $status))
->when($filters['role'] ?? false,
fn($q, $role) => $q->where('role', $role))
->when($filters['search'] ?? false,
fn($q, $search) => $q->where('name', 'like', "%{$search}%"))
->when($filters['date_from'] ?? false,
fn($q, $date) => $q->whereDate('created_at', '>=', $date))
->when($filters['date_to'] ?? false,
fn($q, $date) => $q->whereDate('created_at', '<=', $date));
}
// Контролер - чисто і просто
public function index(Request $request)
{
return User::filter($request->only([
'status', 'role', 'search', 'date_from', 'date_to'
]))->paginate();
}