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

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

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

No results.
Tips 14 березня 2026

Route Caching - миттєвий приріст швидкості

Файл маршрутів завантажується при кожному запиті. З 500+ маршрутами це багато.

Кешування маршрутів компілює маршрути в один закешований файл. В 10 разів швидше.

Як використовувати:

Запустити php artisan route:cache після деплою. Маршрути завантажуються з кешу, а не з файлів.

Важливі обмеження:

Closure маршрути НЕ працюють з кешуванням. Виникнуть помилки. Всі маршрути повинні використовувати синтаксис controller@method.

Найкраща практика:

  1. Ніколи не використовувати closures в маршрутах - завжди контролери
  2. Кешувати маршрути тільки в продакшені
  3. Очищати кеш коли додаються нові маршрути
  4. Додати до скрипту деплою

Порада: Поєднувати з config:cache та view:cache для максимальної продуктивності.

16
// ПОГАНО: Не працює з route:cache
Route::get('/users', function () {
    return User::all();
});

// ДОБРЕ: Працює з кешуванням
Route::get('/users', [UserController::class, 'index']);

// Команди деплою
php artisan config:cache  // Кешувати конфіг
php artisan route:cache   // Кешувати маршрути
php artisan view:cache    // Кешувати view

// Розробка - очистити всі кеші
php artisan optimize:clear

// Перевірити що маршрути закешовані
php artisan route:list
// Має завантажуватись миттєво якщо закешовано

// В composer.json - авто-кеш після деплою
"scripts": {
    "post-autoload-dump": [
        "@php artisan route:cache"
    ]
}
Tips 10 березня 2026

DB::transaction() - захист даних

Переказ $100 між рахунками. Гроші списані з Аліси. Сервер падає. Боб їх ніколи не отримує.

Без транзакцій часткові оновлення пошкодять дані.

Як це працює:

Всі запити виконуються як одна атомарна одиниця. Якщо щось не вдається - все відкочується назад. База даних ніколи не опиняється в неузгодженому стані.

Три способи використання:

  1. Closure (рекомендовано) - автоматичний rollback при винятках
  2. Ручний begin/commit - коли потрібен точний контроль
  3. З повторами - автоматична обробка deadlock

Важливо:

Транзакції працюють тільки з InnoDB таблицями. Тримати їх короткими - вони блокують рядки. Довгі операції блокують інші запити.

Не змішувати виклики зовнішніх API з транзакціями бази даних.

21
// ПОГАНО: Часткове збереження при помилці
$user = User::create($data);
$profile = Profile::create(['user_id' => $user->id]);
// Якщо це не вдається, користувач існує без профілю

// ДОБРЕ: Все або нічого
DB::transaction(function () use ($data) {
    $user = User::create($data);
    $profile = Profile::create(['user_id' => $user->id]);
    $user->sendWelcomeEmail();
});

// Ручний контроль
DB::beginTransaction();
try {
    $order = Order::create($orderData);
    $payment = Payment::create($paymentData);
    DB::commit();
} catch (\Exception $e) {
    DB::rollBack();
    throw $e;
}

// З повтором при deadlock
DB::transaction(function () {
    // Код
}, 3); // Повторити 3 рази якщо deadlock
Tips 06 березня 2026

value() vs first() - економія пам'яті

Потрібна тільки одна колонка з одного рядка? Не треба завантажувати всю модель.

first() створює повну Eloquent модель. value() повертає тільки дані.

Різниця:

  • first() повертає екземпляр моделі з усіма атрибутами
  • value() повертає одне скалярне значення
  • pluck() повертає колекцію значень з кількох рядків

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

Використовувати value() для однієї колонки, одного рядка. Використовувати pluck() для однієї колонки, кількох рядків. Використовувати first() тільки коли потрібні методи моделі.

Порада: На великих таблицях з багатьма колонками value() значно швидший.

29
// ПОГАНО: Завантажує повну модель з усіма колонками
$email = User::where('id', 1)->first()->email;

// ДОБРЕ: Повертає тільки рядок email
$email = User::where('id', 1)->value('email');

// Декілька рядків, одна колонка
$emails = User::where('active', true)->pluck('email');
// Повертає: Collection ['john@ex.com', 'jane@ex.com']

// Потрібні декілька колонок з кількох рядків?
$users = User::select('id', 'email')->get();

// З ключем за ID
$emails = User::pluck('email', 'id');
// Повертає: [1 => 'john@ex.com', 2 => 'jane@ex.com']
Tips 02 березня 2026

Зупинка проблеми N+1 запитів

Сторінка завантажує 10 постів. База даних робить 101 запит.

1 запит для постів. 100 запитів для авторів. Класична проблема N+1.

Рішення: Eager Loading

Використання with() для завантаження зв'язків наперед. Один запит стає двома.

Порада: Laravel Debugbar показує всі запити. Спочатку встановити його.

Коли НЕ використовувати eager loading:

  • Насправді не потрібні дані зв'язків
  • При роботі з одним записом (немає циклу = немає N+1)
  • Зв'язок повертає величезні набори даних (може бути гірше за N+1)

Просунутий трюк:

Використовувати withCount() коли потрібна тільки кількість, а не повний зв'язок.

22
// ПОГАНО: 101 запит
$posts = Post::all();
foreach ($posts as $post) {
    echo $post->author->name; // Запит на кожен пост
}

// ДОБРЕ: 2 запити
$posts = Post::with('author')->get();
foreach ($posts as $post) {
    echo $post->author->name; // Без додаткових запитів
}

// Завантажити декілька зв'язків
$posts = Post::with(['author', 'comments', 'tags'])->get();

// Вкладені зв'язки
$posts = Post::with('comments.author')->get();

// Потрібна тільки кількість?
$posts = Post::withCount('comments')->get();
echo $posts[0]->comments_count; // Зв'язок не завантажений

Матеріали за темою «Laravel»: усе, що ми писали про це українською. Нижче - суміжні теми, якщо шукаєте ширше.

Зараз опубліковано 150 матеріалів від 3 авторів. Останній матеріал - 12 вересня 2026.