Непонятное полиморфное отношение в laravel
Имеется: модель Post
id - integer
title - string
body - text
модель Comment
id - integer
body - text
post_id - integer
commentable_type - string
В Comment настроено такое отношение
public function post(): BelongsTo
{
return $this->belongsTo(Post::class);
}
public function expansion(): MorphTo
{
return $this->morphTo();
}
Важно, если в обычных полиморфных отношениях commentable_type указывает родительскую модель, а post_id указывает идентификатор модели, то тут все сложнее. post_id действительно указывает на идентификатор родительской модели, а вот сама модель указанная в поле commentable_type является ссылается на дочерние модели CommentChildOne и CommentChildTwo, которых не существует в базе. Это просто какие-то синтетические модели расширяющие базовую Comment.
Если я в Post строю обычную связь
public function comments(): hasMany
{
return $this->hasMany(Comment::class, 'post_id');
}
То получаю нужные записи, однако они имеют тип Comment. Возможно ли построить такое полиморфное отношение, что бы получать дочерние модели CommentChildOne, CommentChildTwo?
Ответы (1 шт):
Может быть кому-то пригодится. Стандартными отношениями не получилось реализовать, переписывать Laravel это тоже не тот подход, который нужен. Так как CommentChildOne CommentChildTwo дочерние синтетически(которых нет в базе) классы класса Comment. То они обладают всеми теми же свойствами и методами, что и родитель. Потому внутри класса Post были сделаны 2 функции, которые находят записи для данной записи.
public function getCommentChildOne(int $post_id)
{
$commentChildOne = new CommentChildOne();
return $commentChildOne::where('post_id', $post_id)->get();
}
public function getCommentChildTwo(int $post_id)
{
$commentChildTwo = new CommentChildTwo();
return $commentChildTwo::where('post_id', $post_id)->get();
}