Метод orWhereHas
Метод orWhereHas применяется к запросу Eloquent и добавляет условие, которое проверяет существование связанных записей. Данный метод работает аналогично whereHas, но добавляет условие через логическое ИЛИ. Первым параметром передаётся имя отношения, вторым - замыкание, в котором задаются условия для связанных записей. Третьим необязательным параметром можно указать оператор сравнения, а четвёртым - количество связанных записей.
Синтаксис
<?php
Model::orWhereHas($relation, $callback, $operator, $count);
?>
Пример
Давайте получим все статьи, у которых статус 'published' или есть комментарии:
<?php
use AppModelsArticle;
$articles = Article::where('status', 'published')
->orWhereHas('comments', function ($query) {
$query->where('is_active', true);
})
->get();
foreach ($articles as $article) {
echo $article->title;
}
?>
Результат выполнения кода:
"article 1"
"article 3"
"article 5"
Пример
Давайте получим пользователей, у которых роль 'admin' или есть записи в блоге, созданные после 2025 года:
<?php
use AppModelsUser;
$users = User::where('role', 'admin')
->orWhereHas('posts', function ($query) {
$query->whereYear('created_at', '>', 2025);
})
->get();
foreach ($users as $user) {
echo $user->name;
}
?>
Результат выполнения кода:
"John Doe"
"Jane Smith"
"Bob Johnson"
Пример с количеством записей
Давайте получим категории, у которых название 'popular' или количество товаров больше 5:
<?php
use AppModelsCategory;
$categories = Category::where('name', 'popular')
->orWhereHas('products', function ($query) {
$query->where('is_active', true);
}, '>', 5)
->get();
foreach ($categories as $category) {
echo $category->name;
}
?>
Результат выполнения кода:
"popular"
"electronics"
"books"
Пример с вложенными условиями
Давайте получим посты, у которых автор активен или есть комментарии от пользователей с рейтингом выше 4:
<?php
use AppModelsPost;
$posts = Post::whereHas('author', function ($query) {
$query->where('is_active', true);
})
->orWhereHas('comments', function ($query) {
$query->whereHas('user', function ($subQuery) {
$subQuery->where('rating', '>', 4);
});
})
->get();
foreach ($posts as $post) {
echo $post->title;
}
?>
Результат выполнения кода:
"Post 1"
"Post 4"
"Post 7"
Смотрите также
-
метод
whereHas,
который проверяет существование связанных записей -
метод
orWhere,
который добавляет условие через ИЛИ -
метод
whereDoesntHave,
который выбирает записи без связанных элементов -
метод
get,
который выполняет запрос и возвращает коллекцию