sequelize-cursor-pagination中如何基于关联模型字段添加排序条件并解决分页崩溃问题?
sequelize-cursor-pagination中如何基于关联模型字段添加排序条件并解决分页崩溃问题?
我太懂你这个烦恼了——想用sequelize-cursor-pagination按关联模型的字段排序,结果用Sequelize.literal写的排序只在第一页好使,一点击第二页就崩,还报找不到undefined表的错。其实这问题根源在于分页包生成后续页的cursor查询时,没法正确解析你literal里的关联表别名,直接把表名给搞成undefined了。
给你个亲测有效的解决思路:把关联模型的字段“挪”到主查询里当别名字段,然后按这个别名排序,这样分页包就能正常识别处理了。
具体操作步骤
给主查询加关联字段的别名
修改你的queryDict,在attributes里把关联表的number字段转成整数后,作为主查询的一个别名字段(比如叫controlNumber):const queryDict = { where: { orgPk }, attributes: { include: [ // 把关联表的number字段转成整数,作为主查询的别名字段 [Sequelize.literal('CAST("control"."number" AS INTEGER)'), 'controlNumber'] ] }, include: [...(associations.includeControl ? [{ model: db.Control, as: 'control', where: { orgPk }, // 可选:如果必须关联存在,加required: true required: true }] : [])], }按别名字段排序
现在排序就不用直接怼关联表的字段了,直接用刚才定义的controlNumber就行,分页包完全能hold住:order: associations.includeControl ? ['controlNumber', 'ASC'] : []
为啥这方法能解决问题?
之前你用literal直接关联表字段排序时,分页包根本解析不了这个literal里的表别名,生成下一页cursor查询时,硬生生把表名换成了undefined,PostgreSQL自然找不到对应的表。而把关联字段变成主查询的别名字段后,排序条件就成了主模型的一个“虚拟”属性,分页包能正常识别追踪,后续的cursor查询也能正确引用,自然不会再崩了。
额外提醒
- 一定要保证
include里的as别名(这里是control)和literal里的表别名完全一致,PostgreSQL对大小写敏感,别漏了双引号。 - 如果关联是可选的(没加
required: true),记得处理controlNumber为null的情况,比如排序时加NULLS LAST或者NULLS FIRST,避免排序乱掉。
内容来源于stack exchange
相关产品推荐
相关产品推荐

