MariaDB中communes与code_postals表的Sequelize关联配置求助
Sequelize 关联配置修正方案
核心关联类型区别
belongsTo:外键存放在当前模型对应的表中,指向关联模型的主键,表示当前模型属于某一个关联模型hasOne:外键存放在关联模型对应的表中,指向当前模型的主键,表示当前模型有且仅有一个关联模型(一对一关系)hasMany:外键存放在关联模型对应的表中,指向当前模型的主键,表示当前模型有多个关联模型(一对多关系)belongsToMany:多对多关系,需要额外的中间表存储两个模型的主键映射,不需要在两个模型自身的表中存外键
场景错误点分析
你当前的关联配置完全搞反了关系:
你用Postal.hasOne(Communes)相当于告诉Sequelizecommunes表中存在外键指向code_postals表的主键,这和你实际的表结构完全相反,自然无法生成正确的SQL。
另外你提到的「一个城市对应多个邮编、一个邮编对应多个城市」的多对多关系,你当前的表结构已经通过code_postals表做了映射(该表是复合主键code_commune + code_postal),不需要额外用belongsToMany配置。
正确配置代码
关联部分修改为:
// 一个城市对应多条邮编记录 Communes.hasMany(Postal, { foreignKey: 'code_commune', // code_postals表中存储的关联字段 sourceKey: 'code_commune' // communes表中被关联的主键字段 }) // 每条邮编记录对应唯一的城市 Postal.belongsTo(Communes, { foreignKey: 'code_commune', // code_postals表中存储的关联字段 targetKey: 'code_commune' // communes表中被指向的主键字段 })
查询部分修改为:
return await Postal.findAll({ include: { model: Communes, required: true // 开启后生成INNER JOIN,默认是LEFT JOIN } }).then((communes: any) => { return communes; }).catch((e: any) => { console.error(e); return false; });
修改后生成的SQL就和你需要的INNER JOIN查询逻辑完全一致。
内容的提问来源于stack exchange,提问作者Wapax
相关产品推荐
相关产品推荐

