РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
321 of 1392 menu

Метод 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,
    который выполняет запрос и возвращает коллекцию
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить