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

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

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

No results.
Email Magic Link
Новини 11 липня 2026

Пакет Email Magic Link для Laravel: безпарольна автентифікація з підтримкою двофакторної перевірки

Новий пакет Email Magic Link для Laravel дозволяє користувачам входити в систему через посилання або одноразовий код, надісланий електронною поштою. Підтримує інтеграцію з Laravel Fortify, захист від сканерів електронної пошти та обмеження повторних надсилань.

5
Патерн Chain of Responsibility
Посібники 08 липня 2026
Патерни проєктування

Chain of Responsibility - ланцюжок обробників

Передає запит ланцюжком обробників, кожен з яких обробляє його або передає далі. Як це лягає на послідовні валідатори та Pipeline у Laravel.

Laravel MPP
Новини 08 липня 2026

Laravel MPP: монетизація API для AI-агентів через HTTP 402

Новий пакет Laravel MPP дозволяє розробникам стягувати плату з AI-агентів за доступ до API-маршрутів через стандарт Machine Payments Protocol. Пакет повертає HTTP-відповідь 402 Payment Required та підтримує два платіжні методи: Stripe SPT і Tempo pathUSD.

13
DDLess
Новини 07 липня 2026

Чого бракує вашому PHP-середовищу розробки

DDLess - нова альтернатива традиційному дебагінгу у Laravel. ПокроковийDebugGer без налаштувань, інтерактивний Playground всередині точок зупинки та Task Runner з повним доступом до додатка. Працює локально безкоштовно.

Патерн Proxy
Посібники 05 липня 2026
Патерни проєктування

Proxy - контроль доступу і кеш

Ставить посередника перед реальним об'єктом для кешування, перевірки прав чи лінивої ініціалізації. Різновиди проксі та відмінність від Decorator.

Tips 04 липня 2026

Оптимізація з Database Views

Складні join'и повторюються скрізь?

Створи database view. Запитуй його як таблицю.

Переваги:

  • Інкапсулює складну логіку
  • Повторне використання в додатку
  • База даних оптимізує view
  • Чистіший код додатку

Компроміс:

Views тільки для читання. Потрібні міграції схеми для змін.

Порада: Ідеально для запитів звітності та дашбордів.

13
// Створити міграцію для view
public function up()
{
    DB::statement("
        CREATE VIEW user_stats AS
        SELECT
            users.id,
            users.name,
            users.email,
            COUNT(DISTINCT orders.id) as total_orders,
            SUM(orders.total) as total_spent,
            MAX(orders.created_at) as last_order_date
        FROM users
        LEFT JOIN orders ON users.id = orders.user_id
        GROUP BY users.id, users.name, users.email
    ");
}

public function down()
{
    DB::statement("DROP VIEW IF EXISTS user_stats");
}

// Створити модель для view
namespace App\Models;

class UserStats extends Model
{
    protected $table = 'user_stats';
    public $timestamps = false;
    public $incrementing = false;
}
// Використовувати view як звичайну модель
$topCustomers = UserStats::where('total_orders', '>', 10)
    ->orderBy('total_spent', 'desc')
    ->limit(100)
    ->get();

// В контролері
public function dashboard()
{
    $stats = UserStats::where('last_order_date', '>=', now()->subDays(30))
        ->orderBy('total_spent', 'desc')
        ->paginate(50);

    return view('admin.customers', compact('stats'));
}

// Складний view звітності
public function up()
{
    DB::statement("
        CREATE VIEW monthly_revenue AS
        SELECT
            DATE_FORMAT(created_at, '%Y-%m') as month,
            COUNT(*) as order_count,
            SUM(total) as revenue,
            AVG(total) as avg_order_value,
            COUNT(DISTINCT user_id) as unique_customers
        FROM orders
        WHERE status = 'completed'
        GROUP BY DATE_FORMAT(created_at, '%Y-%m')
    ");
}
phpcpd-next
Новини 04 липня 2026

Детектор дублювання коду phpcpd-next для PHP 8.5+

phpcpd-next - CLI-інструмент для виявлення скопійованих блоків коду у PHP-проєктах. Підтримує три алгоритми детекції, включно з пошуком переупорядкованих та змінених фрагментів, інтеграцію з GitHub Code Scanning, вбудований API та PHPUnit-трейт для перевірки дублювання у тестах.

5
Tips 03 липня 2026

whereHas() vs whereRelation() - швидша фільтрація

Фільтруєш користувачів які мають пости? whereHas() створює підзапит.

whereRelation() використовує join. Швидше на великих таблицях.

Різниця в продуктивності:

  • whereHas() - підзапит для перевірки кожного рядка
  • whereRelation() - одна join операція

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

Використовуй whereRelation() для простих умов на пов'язаних моделях. Використовуй whereHas() коли потрібна складна логіка або підрахунок.

Покращення Laravel 11:

whereRelation() додано в Laravel 8.57. Читабельніше ніж ручні join'и.

Порада: Для простих фільтрів зв'язків завжди віддавай перевагу whereRelation() над whereHas().

14
// ПОВІЛЬНО: Підзапит для кожного користувача
$users = User::whereHas('posts', function ($query) {
    $query->where('published', true);
})->get();

// ШВИДКО: Одна join операція
$users = User::whereRelation('posts', 'published', true)
    ->get();

// Декілька умов
$users = User::whereRelation('posts', 'published', true)
    ->whereRelation('posts', 'views', '>', 1000)
    ->get();

// Різні зв'язки
$users = User::whereRelation('posts', 'published', true)
    ->whereRelation('profile', 'verified', true)
    ->get();
// Коли ПОТРІБЕН whereHas() - складна логіка
$users = User::whereHas('posts', function ($query) {
    $query->where('published', true)
        ->where(function ($q) {
            $q->where('views', '>', 1000)
              ->orWhere('featured', true);
        });
})->get();

// Підрахунок зв'язків
$users = User::whereHas('posts', fn($q) =>
    $q->where('published', true), '>=', 5
)->get();

// orWhereRelation() також доступний
$users = User::whereRelation('posts', 'status', 'draft')
    ->orWhereRelation('posts', 'status', 'pending')
    ->get();
Tips 02 липня 2026

Уникати select(*) в продакшені

Завантаження всіх колонок? Витрачається пам'ять та пропускну здатність.

Обирай тільки колонки які реально використовуєш. Менший об'єм даних. Швидші запити. Менше пам'яті.

Прихована ціна:

Текстові колонки можуть бути величезними. JSON колонки ще більші. Timestamps які можливо не потрібні.

Перевага індексу:

Запити з меншою кількістю колонок можуть використовувати covering індекси.

Порада: Профілюй з EXPLAIN щоб побачити чи запит використовує index-only scan.

// ПОГАНО: Завантажує все включаючи великі текстові поля
$posts = Post::where('published', true)->get();

// ДОБРЕ: Тільки потрібні колонки
$posts = Post::select('id', 'title', 'slug', 'published_at')
    ->where('published', true)
    ->get();

// Приклад API відповіді
public function index()
{
    return Post::select([
            'id',
            'title',
            'slug',
            'excerpt',
            'published_at',
        ])
        ->with('author:id,name,avatar')
        ->where('published', true)
        ->paginate(20);
}

// Dropdown/автозаповнення
$users = User::select('id', 'name')
    ->where('active', true)
    ->get();

// Зі зв'язками - вказуй колонки для обох
$posts = Post::select('id', 'title', 'author_id')
    ->with('author:id,name')
    ->get();

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

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