You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:08:25