Sequelize关联查询acquisto与prodotto表无法获取关联数据求助
问题原因
关联查询不生效是三个核心问题导致的:
findAll传参格式错误:Sequelize的查询条件、关联配置都要放在同一个配置对象里作为第一个参数传入,你现在把include当成第二个独立参数传了,框架根本不会读取这个关联配置。- 缺少显式关联定义:仅在字段里写
references只会在建表时生成外键约束,不会让Sequelize自动建立模型关联,必须手动调用belongsTo/hasMany这类关联方法声明关系,否则include无法生效。 - 外键字段类型不匹配:
prodotto表主键id_prodotto、utente表主键id_utente都是INTEGER类型,但你在acquisto表里把关联这两个主键的外键prodotto、utente都定义成了STRING类型,关联匹配时会出现类型隐式转换问题,查不到对应数据。
修正方案
1. 修正模型定义+补全关联关系
在三个模型都定义完成后、导出之前,先修正外键类型,再添加关联声明:
// 仅修正Acquisto模型的外键字段类型,Prodotto、Utente模型定义保持原有逻辑即可 const Acquisto = Singleton.getInstance().define('acquisto', { id_acquisto: { type: Sequelize.INTEGER, autoIncrement: true, allowNull: false, primaryKey: true }, utente: { type: Sequelize.INTEGER, // 改为INTEGER,和utente表主键类型一致 allowNull: false, references: { model: Utente, key: 'id_utente' } }, prodotto: { type: Sequelize.INTEGER, // 改为INTEGER,和prodotto表主键类型一致 allowNull: false, references: { model: Prodotto, key: 'id_prodotto' } }, data_acquisto: { type: Sequelize.STRING, allowNull: false }, originale: { type: Sequelize.BOOLEAN, allowNull: false } }, { timestamps: false, freezeTableName: true }); // 补全关联声明 // 一条购买记录对应一个商品 Acquisto.belongsTo(Prodotto, { foreignKey: 'prodotto', // acquisto表存储关联关系的外键字段名 targetKey: 'id_prodotto' // prodotto表被关联的主键字段名 }); // 一条购买记录对应一个用户 Acquisto.belongsTo(Utente, { foreignKey: 'utente', targetKey: 'id_utente' }); // 原有导出逻辑保持不变 module.exports = { sequelize: Singleton.getInstance(), utente: Utente, prodotto: Prodotto, acquisto: Acquisto };
注意:改完外键类型后如果数据库中已经存在acquisto表,需要手动修改表中对应字段的类型,或者删掉旧表让Sequelize重新执行sync生成正确的表结构。
2. 修正查询语句写法
把where和include放到同一个配置对象里,可通过attributes参数指定只返回需要的关联表字段:
const JOIN = await Database.acquisto.findAll({ where: { utente: decoded.id_utente, originale: tipologiaAcquisto }, include: [ { model: Database.prodotto, attributes: ['nome_prodotto'] // 仅返回商品表的nome_prodotto字段,不需要可删除这行 } ] });
执行后返回的每条acquisto记录中会嵌套一个prodotto属性,里面就是关联查询到的nome_prodotto值。
内容的提问来源于stack exchange,提问作者Napster95
相关产品推荐
相关产品推荐

