Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти
Інше
Події Про нас

Статті за тегом «Query Builder»

Статті, новини, туторіали та переклади від учасників спільноти

No results.
Tips 29 червня 2026

toBase() - скидання накладних витрат Eloquent

Потрібна сира продуктивність? Eloquent моделі додають накладні витрати.

toBase() конвертує запит в базовий query builder. Без гідратації моделі.

Повертає stdClass замість моделей. Швидше. Менше пам'яті.

Коли використовувати:

  • Великі експорти де не потрібні методи моделі
  • Запити агрегації
  • Трансформація даних перед відправкою в API
  • Фонова обробка

Компроміс:

Немає accessors, mutators або зв'язків. Тільки сирі дані.

Порада: Використовувати для операцій тільки читання на великих наборах даних.

// ПОГАНО: Створює 10,000 Eloquent моделей
$users = User::where('active', true)->get();

// ДОБРЕ: Повертає stdClass об'єкти
$users = User::where('active', true)
    ->toBase()
    ->get();

// Приклад: Експорт в CSV
$users = User::select('name', 'email')
    ->toBase()
    ->get();

foreach ($users as $user) {
    // $user це stdClass, не User модель
    fputcsv($file, [$user->name, $user->email]);
}

// Працює з chunk теж
User::where('active', true)
    ->toBase()
    ->chunk(1000, function($users) {
        // Обробка без накладних витрат моделі
    });
Tips 28 червня 2026

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();
}