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

Статті за тегом «Laravel»

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

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();
}
Tips 27 червня 2026

DB::raw() - коли Eloquent недостатньо

Потрібен складний SQL? Функції дат? Математичні операції?

Eloquent має межі. DB::raw() дозволяє писати сирий SQL всередині запитів.

Поширені випадки використання:

  • Функції дати/часу
  • Математичні операції
  • Специфічні для бази даних функції
  • Складна агрегація

Попередження безпеки:

Ніколи не передавай вхідні дані користувача безпосередньо в raw(). Використовувати біндінги.

Порада: Розглянь власні query scopes щоб повторно використовувати складні raw вирази.

// Функції дат
$users = User::where('created_at', '>=',
    DB::raw('DATE_SUB(NOW(), INTERVAL 30 DAY)')
)->get();

// Математичні операції
$products = Product::select('*',
    DB::raw('price * quantity as total')
)->get();

// CASE вирази
$posts = Post::select('*',
    DB::raw('CASE WHEN views > 1000 THEN "popular"
             ELSE "regular" END as status')
)->get();

// Агрегація з групуванням
$stats = Order::select(
    DB::raw('DATE(created_at) as date'),
    DB::raw('SUM(total) as revenue'),
    DB::raw('COUNT(*) as orders')
)
->groupBy('date')
->get();

// БЕЗПЕЧНО: Використання біндінгів
$status = 'published';
Post::whereRaw('LOWER(status) = ?', [strtolower($status)])->get();
Filament Optimization
Новини 27 червня 2026

Допоможіть зробити Filament швидшим!

Команда Filament запускає бета-версії v4.12 та v5.7 з масштабними оптимізаціями продуктивності. Розробники можуть вже сьогодні протестувати нову версію у своїх додатках та поділитися результатами з командою.

Tips 26 червня 2026

remember() - кешування результатів запитів

Той самий запит виконується 100 разів за секунду. База даних потіє.

Закешування результатів. Звернись до бази один раз, обслуговуй з кешу.

Спосіб Laravel:

Використовувати remember() на запитах. Автоматично кешує результати з тегами.

Коли кешувати:

  • Дані змінюються рідко (категорії, налаштування)
  • Дорогі запити (join'и, агрегація)
  • Сторінки з високим трафіком

Інвалідація кешу:

Очищати кеш коли дані змінюються використовуючи події моделі.

Порада: Використовувати короткий час кешування (5-15 хвилин) для даних що змінюються іноді.

// ПОГАНО: Звертається до бази кожен раз
$categories = Category::all();

// ДОБРЕ: Кеш на 1 годину
$categories = Cache::remember('categories', 3600, fn() =>
    Category::all()
);

// Використання query builder
$activeUsers = User::where('active', true)->remember(600)->get(); // 10 хвилин

// Кеш з тегами
$posts = Cache::tags(['posts', 'homepage'])
    ->remember('posts.featured', 3600, function () {
        return Post::where('featured', true)->get();
    });

// Інвалідація при події моделі
class Post extends Model
{
    protected static function boot()
    {
        parent::boot();
        static::saved(function () {
            Cache::tags('posts')->flush();
        });
    }
}
// Вічний кеш (ручна інвалідація)
$settings = Cache::rememberForever('settings', fn() =>
    Setting::pluck('value', 'key')
);

// Ключ кешу з параметрами
$userId = 5;
$posts = Cache::remember("user_{$userId}_posts", 3600,
    fn() => Post::where('user_id', $userId)->get()
);

// Умовне кешування
if (config('cache.enabled')) {
    $data = Cache::remember('key', 3600, fn() => expensiveQuery());
} else {
    $data = expensiveQuery();
}

// Очистити конкретний кеш
Cache::forget('categories');

// Очистити тегований кеш
Cache::tags(['posts'])->flush();

// Перевірити чи закешовано
if (Cache::has('categories')) {
    $categories = Cache::get('categories');
}
Yammi Audit Log
Новини 26 червня 2026

Yammi Audit Log: пакет для відстеження змін через черги та фонові завдання

Yammi Audit Log - новий пакет для Laravel, який вирішує проблему аудиту змін у моделях через черги. На відміну від звичайних рішень, він зберігає інформацію про того, хто ініціював зміну, навіть якщо вона відбулася через кілька черг або фонових завдань.

Watchtower
Новини 25 червня 2026

Watchtower: комплексний моніторинг задач, черг та помилок у Laravel

Watchtower - новий Laravel-пакет для централізованого моніторингу scheduled tasks, черг, job'ів та винятків на єдиній панелі. Підтримує будь-які драйвери черг, багатобазові та multi-tenant налаштування, а також включає інструменти для негайного запуску задач та сповіщення про збої.