Sequelize 自定义字段名排序 / 聚合排序 / 别名排序

Sequelize 自定义字段名排序 / 聚合排序 / 别名排序

Sequelize是一个ORM框架,其中已经提供了很多api供我们调用。不过API太多太繁琐,而官方给出的文档也并不非常友好。

恰好有这样一个需求,我需要对数据库中的字段进行聚合排序,但是发现聚合后的别名前还会自动添加表明,导致报错。百度搜了好久都没有相关教程,于是就到官方文档中查了好久资料,最终解决了问题。现在将过程与结果分享给大家。

1. 聚合查询时起别名导致查询结果错误

async function aggregateSort () {
  const res = await Book.findAll({
    attributes: {
      // 聚合id这列,起个别名为total
      include: [[sequelize.fn('COUNT', sequelize.col('id')), 'total']]
    },
      order: [['total', 'DESC']]
  });
  console.log(JSON.stringify(res, null, 2));
}
aggregateSort();

运行截图:Sequelize没办法直接识别到别名
在这里插入图片描述

2. 翻阅官方文档

查看文档中的order的描述,大概意思就是,你可以在中括号中传入两个参数,第一个参数是列或者函数,第二个参数是方向。

在这里插入图片描述

它这里描述的函数很灵性,感觉通过函数去获得别名的值也是有希望的。继续来看看它的4个参数类型的值

Array就是普通的数组,就是我们上面写的那个,不行

fn是用于数据库中的函数操作,不合适

col是列,这个total也不是列,不能指定

literal是个什么东西,我也不清楚,一起来看看
在官网中找到上面这个literal方法,意思为创建一个字面的不会被转译的变量。也就是说,它真就只是个字符串。
在这里插入图片描述

**思考一下:**我们上面的例子中的 total就是因为被转译后才会在前面添加了个book. 然后导致发生了错误。试一下吧。

3. 解决问题

在order中添加sequelize.literal,注意:这里的sequelize是你的数据库连接对象,不是model!

async function aggregateSort () {
  const res = await Book.findAll({
    attributes: {
      // 聚合id这列,起个别名为total
      include: [[sequelize.fn('COUNT', sequelize.col('id')), 'total']]
    },
    order: [[sequelize.literal('total'), 'DESC']]
      // order: [['total', 'DESC']]
  });
  console.log(JSON.stringify(res, null, 2));
}
aggregateSort();

**运行截图:**成功输出结果

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值