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();
**运行截图:**成功输出结果