Метод whereHasMorph
Метод whereHasMorph применяется к запросу Eloquent
и позволяет фильтровать записи по наличию полиморфной
связи, при этом накладывая дополнительные условия на
связанные модели. Первым параметром передаётся имя
отношения, вторым - массив допустимых типов моделей,
третьим - замыкание для настройки условий выборки
связанных моделей. Метод возвращает тот же запрос,
дополненный условием существования.
Синтаксис
<?php
Model::whereHasMorph($relation, $types, $callback);
?>
Пример
Давайте отфильтруем комментарии, которые принадлежат
статьям или постам с 'status' равным 'published':
<?php
use AppModelsComment;
$comments = Comment::whereHasMorph(
'commentable',
[Article::class, Post::class],
function ($query) {
$query->where('status', 'published');
}
)->get();
foreach ($comments as $comment) {
echo $comment->text;
}
?>
Результат выполнения кода:
["Great article!", "Interesting post", "Thanks for sharing"]
Пример
Давайте найдём комментарии, принадлежащие только статьям
с 'views' больше 100:
<?php
use AppModelsComment;
use AppModelsArticle;
$comments = Comment::whereHasMorph(
'commentable',
[Article::class],
function ($query) {
$query->where('views', '>', 100);
}
)->get();
foreach ($comments as $comment) {
echo $comment->text;
}
?>
Результат выполнения кода:
["Excellent explanation", "Very helpful", "Nice tutorial"]
Пример
Давайте отфильтруем комментарии, которые принадлежат
любым моделям с 'created_at' в текущем году:
<?php
use AppModelsComment;
use AppModelsArticle;
use AppModelsPost;
$comments = Comment::whereHasMorph(
'commentable',
[Article::class, Post::class],
function ($query) {
$query->whereYear('created_at', date('Y'));
}
)->get();
foreach ($comments as $comment) {
echo $comment->text;
}
?>
Результат выполнения кода:
["New year news", "First post of the year", "Welcome 2024"]
Пример
Давайте найдём комментарии, у которых связанная модель
имеет 'title', содержащий 'Laravel':
<?php
use AppModelsComment;
use AppModelsArticle;
use AppModelsPost;
$comments = Comment::whereHasMorph(
'commentable',
[Article::class, Post::class],
function ($query) {
$query->where('title', 'like', '%Laravel%');
}
)->get();
foreach ($comments as $comment) {
echo $comment->text;
}
?>
Результат выполнения кода:
["Great framework", "Best PHP framework", "Love Laravel"]
Смотрите также
-
метод
whereHas,
который фильтрует по обычным отношениям -
метод
whereDoesntHaveMorph,
который фильтрует по отсутствию полиморфных связей -
метод
orWhereHas,
который добавляет условие через ИЛИ -
метод
get,
который выполняет запрос и возвращает коллекцию