如何通过Sequelize关联创建sizeChart及关联表数据?
Sequelize关联创建问题:同步生成sizeChart及关联表记录
问题
使用Sequelize ORM创建sizeChart记录时,需要同时创建并关联对应的sizeChartParameters和sizeChartAttributes记录,但目前仅sizeChart表生成了数据,关联的两张表无记录。
错误原因
- 关联关系定义不完整/错误:原表关联仅单向定义,未建立完整外键关联,且关系方向不符合业务逻辑;
- 创建代码格式错误:
create方法中未正确嵌套关联表的数据结构,include参数的使用方式不符合Sequelize关联创建的要求。
修正方案
1. 修正表关联定义
sizeChart表定义
module.exports = function (sequelize, Sequelize) { const SizeChart = sequelize.define('sizeChart', { id: { type: Sequelize.INTEGER, autoIncrement: true, primaryKey: true, allowNull: false, }, categoryId:{ type: Sequelize.INTEGER, allowNull: false, }, nameChart:{ type: Sequelize.TEXT, allowNull: false, }, }); SizeChart.associate = function (models) { // 一个尺码表对应多个参数记录(若为一对一则改为hasOne) SizeChart.hasMany(models.sizeChartParameters, { foreignKey: 'sizeChartId', as: 'sizeChartParameters' }); }; return SizeChart; };
sizeChartParameters表定义
module.exports = function(sequelize, Sequelize) { const SizeChartParameters = sequelize.define('sizeChartParameters', { id: { type: Sequelize.INTEGER, autoIncrement: true, primaryKey: true, allowNull: false, }, attributeValue: { type: Sequelize.TEXT, allowNull: false, }, }); SizeChartParameters.associate = function(models) { // 参数属于某个尺码表 SizeChartParameters.belongsTo(models.sizeChart, { foreignKey: 'sizeChartId', as: 'sizeChart' }); // 参数关联对应的属性 SizeChartParameters.belongsTo(models.sizeChartAttributes, { foreignKey: 'attributeId', as: 'sizeChartAttributes' }); }; return SizeChartParameters; };
sizeChartAttributes表定义
module.exports = function(sequelize, Sequelize) { const SizeChartAttributes = sequelize.define('sizeChartAttributes', { id: { type: Sequelize.INTEGER, autoIncrement: true, primaryKey: true, allowNull: false, }, attributeName: { type: Sequelize.TEXT, allowNull: false, }, }); SizeChartAttributes.associate = function(models) { // 一个属性对应一个参数记录(若为一对多则改为hasMany) SizeChartAttributes.hasOne(models.sizeChartParameters, { foreignKey: 'attributeId', as: 'sizeChartParameters' }); }; return SizeChartAttributes; };
2. 修正创建代码
// 若创建多个参数,sizeChartParameters为数组;单个则为对象 const findChart = await models.sizeChart.create({ categoryId: categoryId, nameChart: sizeChartName, // 嵌套关联表数据,键名对应关联别名或模型名复数 sizeChartParameters: [ { attributeValue: attributeValue, // 嵌套属性表数据 sizeChartAttributes: { attributeName: attributeName } } ] }, { // 指定需要递归创建的关联模型层级 include: [ { model: models.sizeChartParameters, include: [models.sizeChartAttributes] } ] });
关键说明
- 所有关联必须定义双向关联和正确的
foreignKey,Sequelize需通过完整关联关系识别关联记录的创建逻辑; - 创建主表时,关联子表的数据必须嵌套在主数据对象中,键名对应关联别名(若设置
as)或模型名复数; create方法的第二个参数必须通过include指定递归创建的关联模型层级,否则Sequelize仅创建主表记录。
内容的提问来源于stack exchange,提问作者Amwey
相关产品推荐
相关产品推荐

