---
title: "whereHas() vs whereRelation() - швидша фільтрація"
url: https://laravelukraine.com/blog/wherehas-vs-whererelation-svidsa-filtraciia
date: 2026-07-03
---

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

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

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

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

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

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

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

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

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

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

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

```php
// Коли ПОТРІБЕН 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();
```
