Метод 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)"]