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

Блог

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

No results.
Testing AI без API
Новини 01 липня 2026

Тестування AI-систем у Laravel без жодного виклику API

У десятому епізоді серії Ship AI with Laravel показано, як тестувати повноцінну AI-платформу за допомогою Pest без витрат на API-виклики. Використовуючи систему фейків SDK, можна перевіряти агентів, інструменти, векторні бази знань та чат-потоки з детермінованими результатами.

Clonio CLI
Новини 01 липня 2026

Clonio CLI: Клонування Продакшн-Бази з Анонімізацією Даних

Clonio CLI - інструмент для безпечного копіювання продакшн-бази даних у розробницьке, CI та тестове оточення з автоматичною анонімізацією персональних даних. Підтримує різні стратегії перетворення колонок, ремапінг первинних ключів та виявлення PII.

Tips 30 червня 2026

Lazy Collections з альтернативою cursor()

cursor() тримає з'єднання з БД відкритим. Ризиковано для довгих операцій.

lazy() використовує chunks внутрішньо. Безпечніше.

Як працює lazy():

Завантажує дані пакетами (типово 1000). Видає елементи один за одним. Закриває з'єднання між пакетами.

Продуктивність:

Ефективна пам'ять як cursor(). Безпека з'єднання як chunk(). Найкраще з обох світів.

Порада: Налаштуй розмір chunk з lazy(500) для точного налаштування.

// Ризиковано: З'єднання залишається відкритим
User::cursor()->each(function ($user) {
    // Довга обробка тут може таймаутнути
    $this->sendEmail($user);
});

// Краще: Chunks з lazy ітерацією
User::lazy()->each(function ($user) {
    // Безпечніше для довгих операцій
    $this->sendEmail($user);
});

// Власний розмір chunk
User::lazy(200)->each(function ($user) {
    $this->processUser($user);
});

// Працює з фільтрами
User::where('active', true)
    ->orderBy('created_at')
    ->lazy()
    ->filter(fn($user) => $user->hasOrders())
    ->each(fn($user) => $this->sendPromo($user));
Laravel WhatsApp
Новини 30 червня 2026

Laravel WhatsApp: Два Бекенди За Одним Фасадом

Новий пакет Laravel WhatsApp від Md Mostafijur Rahman дозволяє надсилати та отримувати повідомлення WhatsApp через офіційний Cloud API Meta та неофіційний веб-інтерфейс за допомогою whatsapp-web.js. Обидва варіанти працюють через єдиний фасад WhatsApp::.

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 з масштабними оптимізаціями продуктивності. Розробники можуть вже сьогодні протестувати нову версію у своїх додатках та поділитися результатами з командою.