4

来自 Ruby/Rails 背景,我习惯了这种语法:

Model.all.order('col1 + col2 + col3')

因此,假设 col1、col2 和 col3 是整数,例如,它将按这 3 列的总和对结果进行排序。

有没有类似的方法可以使用 sequelize 进行排序?

4

3 回答 3

9

使用最新的 master(不确定是否已将更改推送到 npm),您可以执行以下操作:

Model.findAll({ order: [[{ raw: 'col1 + col2 + col3 DESC' }]]});

导致

ORDER BY col1 + col2 + col3 DESC

或者你可以这样做:

Model.findAll({ order: [[sequelize.fn('SUM', sequelize.col('col1'), sequelize.col('col2'), sequelize.col('col3')), 'DESC']]});

导致

ORDER BY SUM(`col1`, `col2`, `col3`) DESC

我会推荐第二个版本,它将正确地转义列名。有关更多信息,请参阅http://sequelizejs.com/documentation#models-finders-limit---offset---order---group

于 2013-10-22T08:04:52.103 回答
5
order: [
   ['created_at', 'desc'],
   ['id', 'desc']
]

或者

order: [
   [sequelize.literal('created_at, id'), 'desc']
]
于 2020-12-09T06:40:32.060 回答
0

必须在我的模型的 defaultScope 中按 col1+col2 排序,作为答案提供的 SUM 解决方案返回了一个 sequelize 错误function sum(numeric, numeric) does not exists(或类似的东西)。

我目前的解决方法:

order: [[ 'col1', sequelize.literal('+'), 'col2', 'DESC']]

这将打印出来

ORDER BY "tableName"."col1"+"col2" DESC

只需添加更多间隔列和sequelize.literal('+')更多列。

如果使用包含/连接并且您需要使用表名调用所有列...我尝试过sequelize.col('col2')但未添加表名。我这样的组合'tableName', sequelize.literal('.'), 'columnName'应该可以工作,但你需要知道你的表名/别名。而且我无法访问我的模型,因为它是在我的用例中定义的。来自文档的{model: 'model', as: 'alias'}也失败了。

于 2021-03-27T17:40:48.910 回答