Tips
28 липня 2026
whereHas() проти has() - фільтр за зв'язками
Треба знайти користувачів, у яких є пости? Або тільки з опублікованими постами?
has() перевіряє факт наявності зв'язку.
whereHas() дозволяє додати умови до зв'язку.
Різниця:
has('posts')- користувачі з будь-якими постамиwhereHas('posts', fn($q) => ...)- користувачі з конкретними постами
Порада по продуктивності:
Використовуйте has(), коли немає додаткових умов - він простіший.
// Користувачі з будь-якими постами
$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();