---
title: "Dynamic Scopes - побудова складних фільтрів"
url: https://laravelukraine.com/blog/dynamic-scopes-pobudova-skladnix-filtriv
author: "Олексій Бабінцев"
date: 2026-06-28
---

# Dynamic Scopes - побудова складних фільтрів

Побудова фільтрів пошуку з купою if виразів? Код стає нечитабельним.

Dynamic scopes дозволяють чисто ланцюжити умови.

**Патерн:**

Кожен scope повертає query builder. Ланцюжи декількох scopes разом.

**Просунута техніка:**

Використовувати `when()` всередині scopes для опціональних умов.

**Переваги:**

- Повторне використання в контролерах
- Тестування ізольовано
- Читабельна побудова запитів

Порада: Створи базовий scope на якому можуть будуватися інші scopes.

```php
// Модель 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();
}
```
