Sequelize关联查询外键字段重复查询报错Unknown column 'comments.userId'
问题根源
你报错的核心原因是comments模型的关联配置写法不符合Sequelize规范,导致框架自动生成了错误的查询字段。belongsTo关联的foreignKey参数仅接收字符串类型的字段名,用来指定当前模型中对应关联表的外键,你在关联Users表时传入了{ user_id: "id", parent_id: "id" }对象,框架无法正确识别外键映射,默认生成了驼峰格式的userId作为关联字段查询,才有了重复别名的错误SQL。
修复方案
如果你的评论表需要同时通过user_id关联发布用户、通过parent_id关联被回复对象,要拆成两个独立的关联配置,用as别名区分:
// 修改comments模型的associate方法 Model.associate = function () { // 关联评论发布用户 Model.belongsTo(app.model.Users, { foreignKey: "user_id", as: "publisher" }); // 若parent_id指向的是父评论id,先关联父评论,再通过父评论关联用户,示例: Model.belongsTo(app.model.Comments, { foreignKey: "parent_id", as: "parentComment" }); // 关联所属文章,注意belongsTo用targetKey指定关联表的目标字段,hasMany才用sourceKey Model.belongsTo(app.model.AllTopics, { foreignKey: "topic_id", targetKey: "id", }); };
如果你查询文章时不需要返回评论关联的用户信息,可以在查询时指定不加载评论的关联数据,也能避免错误:
const topic = await ctx.model.AllTopics.findOne({ where: { id }, include: [{ model: ctx.model.Comments, include: [] // 不加载评论的关联数据 }], });
修复后框架就不会生成多余的userId别名查询字段,报错和重复查询的问题都会解决。
内容的提问来源于stack exchange,提问作者Wei TQ
相关产品推荐
相关产品推荐

