在此解决方案中,来自Laralvel / Eloquent的官方文档 (Polymorphic relations)
posts
id - integer
title - string
body - text
videos
id - integer
title - string
url - string
comments
id - integer
body - text
commentable_id - integer
commentable_type - string
我们可以回复帖子或视频:
$post = App\Post::find(1)
或$post = App\Post::all()
我们可以得到具体的评论
$comment = App\Comment::find(1);
$commentable = $comment->commentable;
在这种情况下,可评论的方法将返回具体的Post
或Video
模型。
但是如何将所有评论作为集合,其中每个项目都是Post
或Video
模型? App\Comment::all()
期望从评论表中返回记录,这不是我们需要的。
答案 0 :(得分:1)
官方文件还提到我们应该如何构建我们的课程
class Comment extends Model
{
/** * Get all of the owning commentable models. */
public function commentable()
{
return $this->morphTo();
}
}
class Post extends Model
{
/** * Get all of post's comments. */
public function comments()
{
return $this->morphMany('App\Comment', 'commentable');
}
}
class Video extends Model
{
/** * Get all of the video's comments. */
public function comments()
{
return $this->morphMany('App\Comment', 'commentable');
}
}
在这样做之后我们可以收到像
这样的帖子的评论$posts = Post::with(`comments`)->get();
$videos = Video::with(`comments`)->get();
方法1
申请union
$all = $videos->union($posts);
结合结果。
方法2
由于union
对您不起作用,您的最新评论可以使用此方法。
$all = collect();
$posts->each(function ($post) use (&$all) {
$all->push($post);
});
$videos->each(function ($video) use (&$all) {
$all->push($video);
});
$all
包含posts
和videos
的所有评论。