Sequelize关联中间表时,sequelize.col与findAndCountAll报错问题
问题解决:Sequelize多关联查询中
sequelize.col('creator.name')无法识别字段 问题原因
当同时包含一对一关联(creator)和多对多关联(studyYears)时,Sequelize生成SQL的过程中对关联表别名的解析出现异常,导致creator.name无法被正确映射到数据库实际字段。
解决方案
方案1:使用sequelize.literal明确指定字段引用
直接用字面量语法指定带反引号的表别名和字段名,绕开Sequelize的别名解析问题:
const { count, rows } = await Student.findAndCountAll({ attributes: [ 'id', 'code', 'name', 'lastname', 'avatar', 'email', 'dni', 'phone', 'dateOfBirth', 'gender', 'address', 'isActive', 'isBanned', [sequelize.literal('`creator`.`name`'), 'creatorName'], ], include: [ { model: User, as: 'creator', attributes: ['name', 'avatar'], }, { model: StudyYear, as: 'studyYears', attributes: ['id', 'year'], through: { attributes: [] }, }, ], paranoid: true, where: {}, order: [], offset: 0, limit: 10, });
方案2:使用数据库实际表名替代关联别名
如果User模型对应的数据库表名为users(Sequelize默认会将模型名复数化作为表名),直接用表名替换关联别名:
[sequelize.col('users.name'), 'creatorName']
方案3:查看生成的SQL确认实际别名
在查询配置中添加logging: console.log,输出Sequelize生成的原始SQL,查看User表实际使用的别名,再对应修改sequelize.col的参数:
const { count, rows } = await Student.findAndCountAll({ // 其他配置不变 logging: console.log, // 输出SQL到控制台 });
比如输出的SQL中User表的别名为User,则修改为[sequelize.col('User.name'), 'creatorName']。
验证结果
使用上述任一方案后,即可在同一查询中同时获取创建者名称(creatorName)和学习年份关联数据,不会再出现Unknown column 'creator.name'的错误。
内容的提问来源于stack exchange,提问作者cesaralvarod
相关产品推荐
相关产品推荐

