如何在AdonisJs Lucid ORM中将排序逻辑转为列实现客户端排序?
解决方案
你可以通过AdonisJs ORM的selectRaw方法,将排序逻辑转换为额外的计算字段(排名字段),同时保留原有查询的所有配置(预加载、计数、分页等),无需切换到原生查询。具体实现如下:
步骤1:定义基础查询构造器
先创建一个包含通用配置的基础查询实例,后续通过clone()复用,避免重复代码:
// 基础查询:包含通用过滤、预加载、计数和分页规则 const postsBase = Post.query() .where('processed', 1) .preload('postTags') .preload('reactions') .preload('tiers') .preload('files') .withCount('reactions') .forPage(1, 40);
步骤2:生成带Hot排名的结果
复制基础查询后,用selectRaw定义hot_rank计算字段,再按该字段排序:
const hotPosts = await postsBase.clone() .select('*') // 保留Post表所有原有字段 .selectRaw('LOG10(reactions_count + 1) + (UNIX_TIMESTAMP(created_at) / 30000) AS hot_rank') .orderBy('hot_rank', 'desc');
步骤3:生成带Trending排名的结果
同理,复制基础查询后定义trending_rank字段并排序:
const trendingPosts = await postsBase.clone() .select('*') .selectRaw('LOG10(reactions_count + 1) + (UNIX_TIMESTAMP(created_at) / 300000) AS trending_rank') .orderBy('trending_rank', 'desc');
关键说明
- 使用
clone()是为了避免修改原始查询构造器,确保hot、trending两个查询互不干扰。 - 返回的每条post数据会包含对应的
hot_rank或trending_rank数值,客户端存入Vuex后,直接用该字段排序即可,无需重新计算逻辑。
内容的提问来源于stack exchange,提问作者Michael Smith
相关产品推荐
相关产品推荐

