继续保存与之相关的多个对象

我不知道该怎么称呼这个问题,但这是我的设置:

var AcademyModule = sequelize.define('academy_module', { academy_id: { type: DataTypes.INTEGER, primaryKey: true }, module_id: { type: DataTypes.INTEGER, primaryKey: true }, module_module_type_id: DataTypes.INTEGER, sort_number: DataTypes.INTEGER, requirements_id: DataTypes.INTEGER }, {freezeTableName: true,} 

通过以下assosiation

 Requirements = sequelize.define('requirements', { id: DataTypes.INTEGER, value: DataTypes.STRING, requirement_type_id: DataTypes.INTEGER }, {freezeTableName: true}); AcademyModule.belongsTo(Requirements, {foreignKey: 'requirements_id'}); 

现在,你可以从我的表设置看到,我将不得不保存在requirements表中的一行,然后使用插入的id插入到academy_module表。

为此,我创build了以下内容:

 add: function (requirements,academyModule,onSuccess, onError) { var academyModule = academyModule; if(requirements == null) { AcademyModule.build(this.dataValues) .save().ok(onSuccess).error(onError); } else { if(requirements.requirement_type_id == '1') { requirements.value = requirements.module.id; } Requirements.create(requirements).then(function(createdReq) { var associationPromises = []; associationPromises.push(AcademyModule.create(this.dataValues)); return sequelize.Promise.all(associationPromises); }).success(onSuccess).error(onError); } } 

然而,在thenfunction,我无法达到包含需要插入的值的academyModule对象。

这对我来说是一个重复的问题,我真的想知道如何可以连接,所以他们自动做,而不做小hacks

我已经查看了文件,但我一直能find上述的一个例子(我觉得这很奇怪,因为这是一个相当正常的情况)

Jan的方法

我试图用Jan的优雅的方法解决它

不过,我收到一个错误说:

 academy_module is not associated to requirements! 

我的代码看起来像这样:

  var academyModule = academyModule; if(requirements == null) { AcademyModule.build(this.dataValues) .save().ok(onSuccess).error(onError); } else { requirements.academy_module = academyModule; Requirements.create(requirements, { include: [AcademyModule] }); } 

这里有趣的事情是我有assitiation:

 AcademyModule.belongsTo(Requirements, {foreignKey: 'requirements_id'}); Requirements.hasOne(AcademyModule, {foreignKey: 'requirements_id'}); 

首先,我不能回答为什么你访问academyModule有问题 – 它应该可以通过简单的JavaScript范围。

你的代码中有一些无法解释的部分…你正在推动一个单一的协议promise – 为什么不只是回报这个承诺?

您正在访问this.dataValues来创build一个AcademyModule实例 – this通常在promise处理程序中是未定义的。

你的问题可以通过嵌套的创build,在2.0.5更优雅的解决: https : //github.com/sequelize/sequelize/pull/3386

首先,您需要从需求 – > AcademyModule创build反向关联

 Requirements.hasOne(AcademyModule, {foreignKey: 'requirements_id'}); 

这是必需的,因为需求是用来创buildAcademyModule的“主模型”

 requirements.academy_module = academy_module; Requirements.create(requirements, { include: [AcademyModule] }); 

通过在要求对象上设置academy_module ,并添加include作为第二个参数(类似于你如何使用include来进行find ),两者都是一次创build和关联的。

您需要稍微修改模型。 用你当前的模型定义表中将包含一个id列,但sequelzie不知道它是主键。 您可能需要从需求模型中完全删除id(在这种情况下,sequelize会自动添加并将其标记为主键),或者添加primaryKey

 id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true // optional - only if you actually want AI :) }