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

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

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

No results.
Найдешевший запит - той, якого немає: eager loading і лічильники Рекомендовано
Посібники 20 липня 2026
Як будувався laravelukraine.com

Найдешевший запит - той, якого немає: eager loading і лічильники

Найдешевший запит - той, якого немає. З цього починаємо серію про продуктивність laravelukraine.com. Eager loading проти N+1 у зв'язках - зокрема підступний випадок аватарів через Spatie MediaLibrary, де забутий author.media повертає прихований запит на кожен рядок. Плюс withCount/loadCount замість ручних COUNT і чому іноді найправильніше рішення - взагалі не кешувати.

Tips 20 липня 2026

when() - умовні фільтри без if/else

Створюєте фільтр пошуку з купою умов if? Це важко читати.

when() додає умову до запиту тільки тоді, коли вона потрібна.

Переваги:

  • Ланцюжок не переривається
  • Код виглядає чистіше
  • Легко читати
  • Без зайвих тимчасових змінних

Просунутий варіант:

Є callback для "else".

Порада: Ідеально для API-фільтрів, де параметри опціональні.

// ПОГАНО
$query = User::query();
if ($request->status) {
  $query->where('status', $request->status);
}
if ($request->role) {
  $query->where('role', $request->role);
}
$users = $query->get();

// ДОБРЕ
$users = User::query()
  ->when($request->status,
    fn($q, $v) => $q->where('status', $v))
  ->when($request->role,
    fn($q, $v) => $q->where('role', $v))
  ->get();

// З "else"
$users = User::when(
  $request->sort === 'name',
  fn($q) => $q->orderBy('name'),
  fn($q) => $q->orderBy('created_at')
)->get();
Tips 17 липня 2026

Soft Deletes - ніколи не втрачайте дані

Користувач випадково видалив свій акаунт. Відновити не можна. Негатив забезпечено.

Soft Deletes позначають запис як видалений, але фактично не прибирають його з бази.

Як працює:

Додаємо поле deleted_at, а Laravel автоматично приховує такі записи.

Корисні методи:

  • forceDelete() - повне видалення
  • withTrashed() - включити видалені
  • onlyTrashed() - лише видалені
  • restore() - відновити

Порада: Сумісно з GDPR: можна відновити за 30 днів, а потім зробити force delete.

// Міграція
Schema::table('users', function (Blueprint $table) {
  $table->softDeletes();
});

// Модель
use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model
{
  use SoftDeletes;
}

// Використання
$user->delete(); // Soft delete
$user->forceDelete(); // Повне видалення

// Запити
User::all(); // Тільки активні
User::withTrashed()->get(); // Включно з видаленими
User::onlyTrashed()->get(); // Лише видалені

// Відновлення
$user = User::withTrashed()->find(1);
$user->restore();

// Перевірка
if ($user->trashed()) {
  // Користувач видалений
}
Laravel Cooldown
Новини 17 липня 2026

Laravel Cooldown: пакет для контролю часових інтервалів між діями

Laravel Cooldown - новий пакет від Mahedi Zaman Zaber, який дозволяє встановлювати часові блокування на конкретні дії: обмеження повторної відправки OTP, інтервали між запитами на скидання пароля, затримки перед повторними спробами платежів та інші сценарії з очікуванням.

Tips 16 липня 2026

updateOrCreate() - простий спосіб upsert

Перевіряєте, чи існує запис, а потім оновлюєте або створюєте? Забагато коду.

updateOrCreate() виконує обидві операції за один раз.

Як працює:

  • Перший аргумент - умови пошуку
  • Другий - дані для оновлення/створення

Магія:

  • Якщо запис знайдено - оновлює
  • Якщо ні - створює

Порада: Ідеально підходить для інтеграцій з API.

// ПОГАНО: два запити, зайвий код
$user = User::where('email', 'john@example.com')->first();
if ($user) {
  $user->update(['name' => 'John Doe']);
} else {
  User::create([
    'email' => 'john@example.com',
    'name' => 'John Doe'
  ]);
}

// ДОБРЕ: один метод, один запит
User::updateOrCreate(
  ['email' => 'john@example.com'],
  ['name' => 'John Doe', 'verified' => true]
);

// Синхронізація даних з API
$apiUsers = ExternalAPI::getUsers();
foreach ($apiUsers as $apiUser) {
  User::updateOrCreate(
    ['external_id' => $apiUser['id']],
    ['name' => $apiUser['name'], 'email' => $apiUser['email']]
  );
}
Laravel 13.20
Новини 16 липня 2026

Laravel 13.20 отримав власну обробку зображень

Вийшов Laravel 13.20, який додає вбудовану обробку зображень через новий Image-фасад, атрибут WithoutMiddleware для контролерів, окремий префікс сесій у Redis, тихе збільшення/зменшення в Eloquent та підтримку enum у WithoutOverlapping.

Tips 15 липня 2026

Query Scopes - принцип DRY для запитів

Пишете where('status', 'active') у 20 контролерах? Перестаньте дублювати код.

Query Scopes дозволяють повторно використовувати логіку запитів. Описали один раз - застосовуєте всюди.

Два типи:

  • Локальні скоупи - методи в моделі (з параметрами або без).
  • Анонімні скоупи - inline-фільтри без визначення методу.

Чому варто використовувати скоупи:

  1. Повторне використання коду
  2. Краща читабельність
  3. Простота тестування
  4. Легко комбінуються між собою

Порада: Методи локальних скоупів починаються зі слова scope - Laravel автоматично прибирає його.

// User Model
public function scopeActive($query)
{
  return $query->where('status', 'active');
}

public function scopeVerified($query)
{
  return $query->whereNotNull('email_verified_at');
}

public function scopeCreatedAfter($query, $date)
{
  return $query->where('created_at', '>', $date);
}

// Використання - чисто та читабельно
$users = User::active()->verified()->get();

$recentUsers = User::active()
  ->createdAfter(now()->subDays(7))
  ->get();

// Комбінування зі звичайними методами запиту
$admins = User::active()
  ->where('role', 'admin')
  ->orderBy('name')
  ->get();
Laravel Quota
Новини 15 липня 2026

Laravel Quota: пакет для контролю лімітів споживання за календарні періоди

Laravel Quota - новий пакет для відстеження та контролю накопичувальних лімітів споживання ресурсів. На відміну від RateLimiter, він рахує витрати відносно бюджету, що скидається на межі календарного періоду, і може зберігати дані у базі даних.

Tips 03 липня 2026

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

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

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

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

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

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

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

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

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

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

// ПОВІЛЬНО: Підзапит для кожного користувача
$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();