Запросы whereHas
- это мощный инструмент, предоставляемый фреймворком Laravel для работы с связанными моделями в базе данных. Они позволяют фильтровать результаты основного запроса на основе условий, заданных для связанных моделей. Запросы whereHas
особенно полезны, когда вы хотите выбрать только те записи, которые имеют связанные модели, соответствующие заданным критериям.
Чтобы построить запрос whereHas
, вам необходимо определить отношение (relationship) между моделями и потом использовать метод whereHas
на основной модели.
Начнем с определения отношения между моделями. Предположим, у нас есть две модели - User
и Post
, и между ними существует отношение "один ко многим", где один пользователь может иметь много постов. В модели User
мы должны определить это отношение следующим образом:
class User extends Model { public function posts() { return $this->hasMany(Post::class); } }
Теперь, когда у нас есть определенное отношение, мы можем построить запрос whereHas
. Этот метод будет фильтровать результаты основного запроса на основе условий, заданных для связанных моделей. Ниже приведен пример запроса, который выбирает только пользователей, у которых есть посты, написанные после определенной даты:
$users = User::whereHas('posts', function ($query) { $query->where('created_at', '>', '2022-01-01'); })->get();
В этом примере мы вызываем метод whereHas
на модели User
с аргументами: название отношения (posts
) и анонимной функцией, которая принимает объект запроса к модели Post
в качестве аргумента. Внутри этой функции мы можем определить условия для выбора только тех постов, которые удовлетворяют нашему критерию (например, созданы после 1 января 2022 года).
Таким образом, в результате мы получим всех пользователей, у которых есть посты, удовлетворяющие нашему условию.
whereHas
также поддерживает более сложные условия, такие как замыкания, булевы операции и дополнительные методы запроса. Вы можете комбинировать с ними различные условия, чтобы создать более точный запрос.
В заключение, запросы whereHas
являются мощным инструментом фреймворка Laravel для фильтрации результатов основного запроса на основе условий, заданных для связанных моделей. Они позволяют вам гибко выбирать только те записи, которые соответствуют вашим требованиям.