laravel关联模型中使用group by分组


laravel.jpg

比如一篇文章(articles)有多个评论(comments)的一对多关联,使用hasMany()方法

//articles model
public function comments($type)
{
    return $this->hasMany(Comment::class, 'article_id', 'id')
        ->selectRaw('article_id, count(*) as aggregate')
        ->groupBy('article_id');
}

//controller 获取有至少审核通过(state=1)一条评论的文章并统计评论数
Articles
::WhereHas('comments',function(){
   $q->where('state',1)
},'>',1)
->with('comments'=>function(){
   $q->where('state',1)
})
->get()

注意:分析SQL语句可知,此过程分两步,有两个sql语句,第一步查文章(sql语句1),第二部,查评论(sql语句2)

上面用到whereHas的闭包是对articles的数据进行过滤(有至少一条评论状态为1的文章->sql语句1),而此闭包并不对关联的评论生效(->sql语句2)

而with下的闭包,是对关联的评论进行过滤(->sql语句2).

本文 暂无 评论

Top