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

Метод morphMany

Метод morphMany определяет полиморфную связь типа "один ко многим". Он позволяет модели иметь множество связанных записей из разных моделей, используя два поля в дочерней таблице: идентификатор связанной записи и тип модели. Первым параметром передается имя дочерней модели, вторым - имя поля, хранящего тип родительской модели, третьим - имя поля с идентификатором родительской записи.

Синтаксис

<?php class ParentModel extends Model { public function children() { return $this->morphMany( ChildModel::class, 'parent_type', 'parent_id' ); } } ?>

Пример

Определим модель Post, которая может иметь множество комментариев. Комментарии также могут принадлежать другим моделям, например, Video:

<?php namespace AppModels; use IlluminateDatabaseEloquentModel; class Post extends Model { public function comments() { return $this->morphMany( Comment::class, 'commentable', 'commentable_id' ); } } ?>

Модель комментария использует метод morphTo для обратной связи:

<?php namespace AppModels; use IlluminateDatabaseEloquentModel; class Comment extends Model { public function commentable() { return $this->morphTo(); } } ?>

Пример

Получим все комментарии поста с id равным 1:

<?php use AppModelsPost; use AppModelsComment; $post = Post::find(1); $comments = $post->comments; foreach ($comments as $comment) { echo $comment->content; } ?>

Результат выполнения кода:

["Great post!", "Very informative", "Thanks for sharing"]

Пример

Добавим новый комментарий к посту с использованием связи:

<?php use AppModelsPost; use AppModelsComment; $post = Post::find(1); $comment = new Comment([ 'content' => 'Excellent article!', 'author' => 'John Doe' ]); $post->comments()->save($comment); echo $comment->commentable->title; ?>

Результат выполнения кода:

"Laravel Polymorphic Relations"

Пример

Получим последние 5 комментариев для поста с использованием запроса:

<?php use AppModelsPost; use AppModelsComment; $post = Post::find(1); $comments = $post->comments() ->orderBy('created_at', 'desc') ->limit(5) ->get(); foreach ($comments as $comment) { echo $comment->content . ' (' . $comment->created_at . ')'; } ?>

Результат выполнения кода:

["Great article! (2026-09-07 15:30:00)", "Nice explanation (2026-09-07 14:20:00)", "Very helpful (2026-09-07 12:10:00)", "Thanks (2026-09-07 10:05:00)", "Awesome (2026-09-07 09:15:00)"]

Смотрите также

  • метод morphTo,
    который определяет обратную полиморфную связь
  • метод morphOne,
    который определяет полиморфную связь "один к одному"
  • метод hasMany,
    который определяет обычную связь "один ко многим"
  • метод get,
    который выполняет запрос и возвращает коллекцию
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить