Yii2+PostgreSQL下基于关联表按点赞数排序视频的实现求助
按点赞数排序视频的解决方案(Yii2 + PostgreSQL)
嗨,我来帮你搞定这个需求!既然你已经拆分了video和关联的video-like表,我们只需要通过关联查询统计每个视频的点赞数,再用这个统计值来排序就可以了。下面给你两种常用的实现方式:
方法一:使用Yii2的withCount便捷方法
Yii2的ActiveRecord提供了withCount方法,可以快速统计关联模型的数量,非常省心。首先确保你的Video模型里已经定义了和VideoLike的关联:
// 在Video模型中 public function getLikes() { return $this->hasMany(VideoLike::class, ['video_id' => 'id']); }
然后修改你的查询代码,加入withCount和对应的排序:
$this->withCount('likes') // 自动生成`likes_count`字段,统计每个视频的点赞数 ->orderBy([ 'likes_count' => SORT_DESC, // 优先按点赞数降序 'created_at' => SORT_DESC // 点赞数相同时,按创建时间降序(保留你原来的逻辑) ]);
方法二:手动左连接+统计
如果你需要更灵活的控制(比如自定义统计条件),可以用leftJoin结合聚合函数来实现:
$this->select(['video.*', 'COUNT(video_like.id) AS likes_count']) ->leftJoin('video_like', 'video.id = video_like.video_id') ->groupBy('video.id') // PostgreSQL要求分组字段包含主键,这里用video.id即可 ->orderBy([ 'likes_count' => SORT_DESC, 'created_at' => SORT_DESC ]);
额外小技巧
如果只想显示有点赞的视频,可以在查询后加上having条件:
->having(['>', 'likes_count', 0])
这样就能完美实现按点赞数排序的需求啦,两种方法都适配PostgreSQL的语法,你可以根据自己的场景选择~
内容的提问来源于stack exchange,提问作者clemente aranguiz
相关产品推荐
相关产品推荐

