Eloquent:如何获得所有多态模型?

时间:2017-01-18 01:09:26

标签: laravel eloquent

在此解决方案中,来自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;

在这种情况下,可评论的方法将返回具体的PostVideo模型。

但是如何将所有评论作为集合,其中每个项目都是PostVideo模型? App\Comment::all()期望从评论表中返回记录,这不是我们需要的。

1 个答案:

答案 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包含postsvideos的所有评论。