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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:30:55