Sequelize按关联模型TrLine的存在性排序问题
解决方案
要实现优先展示存在对应TrLine记录的TrProduct,你需要在排序规则中先按TrLine记录的存在性排序,再按原有的TrLine id排序。具体修改如下:
首先确保已引入Sequelize(未引入则添加const { Sequelize } = require('sequelize');),然后调整order配置:
const products = await TrProduct.findAll({ where: { userId: userId, }, offset: (page - 1) * 20, limit: 20, attributes: ['id'], include: { model: TrLine, limit: 1, required: false }, order: [ // 优先排序:存在TrLine的记录在前 [Sequelize.literal('"TrLine"."id" IS NOT NULL'), 'DESC'], // 再按TrLine的id升序,空值后置 [TrLine, 'id', 'ASC', 'NULLS LAST'] ] });
关键说明
Sequelize.literal('"TrLine"."id" IS NOT NULL')会生成SQL判断:若TrLine的id不为空(即存在关联记录),返回true(对应数值1),否则返回false(对应数值0)。用DESC排序时,1会排在0前面,实现有TrLine的记录优先展示。- 保留原有
[TrLine, 'id', 'ASC', 'NULLS LAST'],用于在存在TrLine的记录内部按id升序排列,同时确保无TrLine的记录排在最后且内部顺序不影响。
如果你的表名或字段名在SQL中是小写格式(比如trline而非TrLine),需要调整literal里的引号部分,匹配实际生成的SQL表名。
内容的提问来源于stack exchange,提问作者Hasan Toker
相关产品推荐
相关产品推荐

