SequelizeJS嵌套关联使用order排序报错问题求助
Sequelize 6.33.0嵌套关联下排序报错的解决方法
问题描述
使用Sequelize 6.33.0查询ProductTocategoryModel时,期望按关联的ProductModel的position字段升序排序。仅关联ProductModel时排序功能正常,但同时嵌套关联ProductVariationModel后,触发ER_BAD_FIELD_ERROR错误,提示product.position字段不存在。
报错原因
- GROUP BY 模式限制:MySQL开启
ONLY_FULL_GROUP_BY模式后,ORDER BY中使用的字段必须出现在GROUP BY列表中,或被聚合函数包裹。当前仅按productId分组,position字段未被包含,导致SQL语法不合法。 - 嵌套关联别名冲突:多层嵌套关联时,Sequelize可能对关联表使用非预期的别名,导致
order配置中的ProductModel无法正确映射到SQL中的表别名。
解决方案
方案1:调整GROUP BY列表,包含排序字段
将position字段加入group配置,满足ONLY_FULL_GROUP_BY的要求:
ProductTocategoryModel.findAll({ where: whereProductTocategory, offset, limit: NB_ITEM_PER_PAGES, include: [ { model: ProductModel, where: whereProduct, include: [{ model: ProductVariationModel, required: false }] }, { model: ProductCategoryModel, where: { state: true } } ], order: [ [ProductModel, 'position', 'ASC'] ], // 加入product.position到分组列表 group: ['productId', `${ProductModel.tableName}.position`] })
方案2:使用关联名称指定排序路径
直接通过ProductTocategoryModel与ProductModel的关联名称(默认是模型名小写product)指定排序字段,避免别名冲突:
ProductTocategoryModel.findAll({ where: whereProductTocategory, offset, limit: NB_ITEM_PER_PAGES, include: [ { model: ProductModel, where: whereProduct, include: [{ model: ProductVariationModel, required: false }] }, { model: ProductCategoryModel, where: { state: true } } ], // 使用关联名称指定排序 order: [ ['product', 'position', 'ASC'] ], group: ['productId'] })
方案3:明确指定ProductModel的查询字段
在include ProductModel时,显式声明attributes包含position,确保字段被SQL查询选中:
ProductTocategoryModel.findAll({ where: whereProductTocategory, offset, limit: NB_ITEM_PER_PAGES, include: [ { model: ProductModel, where: whereProduct, // 显式指定需要的字段,包含position attributes: ['id', 'position', /* 其他需要的字段 */], include: [{ model: ProductVariationModel, required: false }] }, { model: ProductCategoryModel, where: { state: true } } ], order: [ [ProductModel, 'position', 'ASC'] ], group: ['productId'] })
验证说明
以上方案均可解决嵌套关联下的排序报错问题,优先推荐方案2,无需修改分组或字段列表,直接针对别名问题修复,更贴合业务逻辑。
内容的提问来源于stack exchange,提问作者tonymx227
相关产品推荐
相关产品推荐

