---
title: "whereHas() проти has() - фільтр за зв'язками"
url: https://laravelukraine.com/blog/wherehas-proti-has-filtr-za-zviazkami
date: 2026-07-28
---

# whereHas() проти has() - фільтр за зв'язками

Треба знайти користувачів, у яких є пости? Або тільки з опублікованими постами?

`has()` перевіряє факт наявності зв'язку.
`whereHas()` дозволяє додати умови до зв'язку.

**Різниця:**

* `has('posts')` - користувачі з будь-якими постами
* `whereHas('posts', fn($q) => ...)` - користувачі з конкретними постами

**Порада по продуктивності:**

Використовуйте `has()`, коли немає додаткових умов - він простіший.

```php
// Користувачі з будь-якими постами
$users = User::has('posts')->get();

// Користувачі з мінімум 5 постами
$users = User::has('posts', '>=', 5)->get();

// Користувачі тільки з опублікованими постами
$users = User::whereHas('posts', function ($query) {
  $query->where('published', true);
})->get();

// Більш складні умови
$users = User::whereHas('posts', function ($query) {
  $query->where('published', true)
    ->where('views', '>', 1000);
})->get();

// Користувачі без постів
$users = User::doesntHave('posts')->get();

// Комбінування кількох зв'язків
$users = User::has('posts')
  ->whereHas('comments', fn($q) => $q->where('spam', false))
  ->get();
```
