Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
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();

Читати в документації

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Інші поради

Tips 28 жовтня 2026

Правило `Password` - сильні паролі “з коробки”

Потрібні надійні вимоги до пароля?

Готовий клас-правило Password закриває це.

Можливості:

  • Мінімальна довжина
  • Літери, цифри, символи
  • Різний регістр
  • Перевірка “uncompromised” (Have I Been Pwned)

Laravel 11:

Illuminate\Validation\Rules\Password

Порада: задайте дефолти в AppServiceProvider.

use Illuminate\Validation\Rules\Password;

public function rules()
{
  return [
    'password' => [
      'required',
      'confirmed',
      Password::min(8)
        ->letters()
        ->mixedCase()
        ->numbers()
        ->symbols()
        ->uncompromised(),
    ],
  ];
}
Tips 26 жовтня 2026

`distinct` - без дублікатів у масивах

Відправляєте масив значень і треба гарантувати унікальність?

distinct перевіряє, що дублікатів немає.

Коли корисно:

  • Списки email’ів
  • Теги
  • Multi-select
  • Bulk-операції

Опції:

  • distinct — чутливо до регістру
  • distinct:ignore_case — без урахування регістру
  • distinct:strict — строгі типи

Порада: комбінуйте з правилами array.

public function rules()
{
  return [
    'emails' => 'required|array',
    'emails.*' => 'email|distinct',

    'tags' => 'required|array',
    'tags.*' => 'string|distinct:ignore_case',

    'ids' => 'required|array',
    'ids.*' => 'integer|distinct:strict',
  ];
}
Tips 23 жовтня 2026

`required_if` - умовно обов’язкові поля

Поле має бути обов’язковим лише за певних умов?

required_if робить це чисто.

Синтаксис:

required_if:another_field,value

Коли корисно:

  • Поля оплати залежно від методу
  • Адреса залежно від перемикача
  • Динамічні секції форми

Кілька значень:

через кому.

Порада: для зворотної логіки використовуйте required_unless.

public function rules()
{
  return [
    'payment_method' => 'required|in:card,bank,paypal',
    'card_number' => 'required_if:payment_method,card',
    'bank_account' => 'required_if:payment_method,bank',
    'paypal_email' => 'required_if:payment_method,paypal',

    'account_type' => 'required|in:personal,business',
    'company_name' => 'required_if:account_type,business',
  ];
}
Tips 21 жовтня 2026

`dimensions` - точна валідація розмірів зображення

Користувачі завантажують величезні фото — верстка ламається через неправильні розміри.

dimensions валідує ширину, висоту та співвідношення сторін.

Обмеження:

  • min_width, max_width
  • min_height, max_height
  • width, height (точні)
  • ratio (width/height)

Коли корисно:

  • Аватар (тільки квадрат)
  • Банер (задане співвідношення)
  • Генерація прев’ю
  • Вимоги адаптивного дизайну

Порада: комбінуйте з image, mimes та max для повної перевірки.

public function rules()
{
  return [
    'avatar' => [
      'required', 'image',
      'dimensions:width=200,height=200',
    ],
    'banner' => [
      'required', 'image',
      'dimensions:min_width=1200,min_height=300',
    ],
    'thumbnail' => [
      'required', 'image', 'dimensions:ratio=16/9',
    ],
  ];
}
Tips 19 жовтня 2026

Валідація Enum - типобезпечні значення у формах

Статус може бути pending, active, inactive. Валідувати рядками?

PHP 8.1 Enums + Laravel validation = типобезпека.

Rule::enum() валідує значення по Enum case’ах автоматично.

Переваги:

  • Змінили Enum — валідація підлаштувалась
  • Жодних хардкод-рядків
  • Автодоповнення в IDE
  • Зручний рефакторинг

Порада: використовуйте backed enums (string/int) для збереження в БД.

enum OrderStatus: string
{
  case Pending = 'pending';
  case Processing = 'processing';
  case Completed = 'completed';
}

public function rules()
{
  return [
    'status' => ['required', Rule::enum(OrderStatus::class)],
  ];
}

// Каст у моделі - і жодних рядкових статусів
protected $casts = ['status' => OrderStatus::class];
Завантаження...