В Laravel, чтобы получить отношения с фильтрацией по значениям из других отношений, можно использовать метод whereHas
.
whereHas
позволяет указать условия фильтрации для связанных моделей. Применение whereHas
позволяет получить только те записи, которые удовлетворяют условиям фильтрации в связанной модели.
Для демонстрации концепции, рассмотрим пример моделей User
и Post
, где связь между ними это "один ко многим". У каждого пользователя может быть несколько постов. Посты имеют статус "опубликовано" или "черновик". Мы хотим получить только те пользователей, у которых есть опубликованные посты.
Для начала создадим соответствующие модели и опишем их отношения:
class User extends Model { public function posts() { return $this->hasMany(Post::class); } } class Post extends Model { public function user() { return $this->belongsTo(User::class); } }
Затем, чтобы получить пользователей с опубликованными постами, можно сделать следующий запрос:
$usersWithPublishedPosts = User::whereHas('posts', function ($query) { $query->where('status', 'published'); })->get();
Здесь мы использовали метод whereHas
, чтобы указать, что мы хотим получить только пользователей, у которых есть посты, удовлетворяющие условию status = 'published'
. Метод get
в конце запроса возвращает коллекцию моделей, удовлетворяющих указанным условиям.
Таким образом, использование метода whereHas
позволяет получить отношения, которые проходят фильтрацию по значениям из других отношений одним запросом.