laravel多表查询count的问题

数据库结构
1:user用户表 id
2:user_attention用户收藏文章关联表 id,user_id,article_id
3:user_comment用户留言文章关联表 id,user_id,article_id,comment

要求:用户列表,查询文章收藏数,留言数,并且能够排序. 如果用laravel模型关联withCount就能得到数量,但没法根据数量排序。现在尝试用join联表查询,但attentions和comments结果总是一样,该怎么写得到正确结果?或者laravel能根据withCount结果排序吗

$list=User::leftjoin('user_attention as ua','ua.user_id','=','user.id')
->leftjoin('user_comment as uc','uc.user_id','=','user.id')
->selectRaw('user.id,user.name,user.img,count(ua.id) as attentions,count(uc.id) as comments')
->groupBy('user.id')
->paginate(10);
阅读 1.4k
评论
    3 个回答
    • 1.5k

    orderByRaw(DB::count(uc.id)) 试试这个能不能根据count值排序呢,我没试验,记得大概这样用过。

      你这没有假数据,没法测试,就只好根据描述简单写一下,不一定正确,没有运行过。
      用框架的同时,不要拘谨与框架,最起码的原生还是要会写的,其次,正如其他答主所说,这种情况可以使用 Redis 或者 在 User 表做冗余统计,亦或者在着两个表上加一个累计量的字段,做冗余,方便应对于这种场景。

      SELECT *
      FROM 
          (SELECT user_id,
              count(user_comment.*) AS comment_count,
              count(user_attention.*) AS attention_count
          FROM user
          LEFT JOIN user_attention
              ON user.id = user_attention.user_id
          LEFT JOIN user_comment
              ON user_comment.user_id = user.id
          GROUP BY  user.id)
      ORDER BY  comment_count;
        • 270

        建议可以做 冗余,数量用单独字段存起来,这样不管是排序,还是显示,查询都比较方便。

          撰写回答

          登录后参与交流、获取后续更新提醒