Очень часто возникает ситуация, когда нужно выбрать только те модели у которых есть связь. Например посмотреть сколько пользователей оставили комментарий, статьи с комментариями, вывести список пользователей у которых есть корзина с товарами и так далее. Для этого разработчики фреймворка подготовили нам несколько полезных методов — has
, whereHas
.
Выбираем модели у которых есть связанные записи:
Post::has('comments')->get(); // User::has('carts')->get();
Метод has
принимает так называемый вложенный синтаксис. Например выберем пользователей с корзинами у которых есть товар:
User::has('carts.products')->get();
Или посты с комментариями у которых есть лайки:
Post::has('comments.likes')->get();
Также есть более продвинутый вариант — whereHas
/ orWhereHas
. Этот метод позволяет задать условие для выборки.
Post::whereHas('comments', function (Builder $query) { $query->where('content', 'like', 'текст%'); })->get(); // or App\Post::whereHas('comments', function (Builder $query) { $query->where('approved', 1); })->get();
Источник — https://laravel.com/docs/5.8/eloquent-relationships#querying-relationship-existence