继续保存与之相关的多个对象
我不知道该怎么称呼这个问题,但这是我的设置:
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); } }
然而,在then
function,我无法达到包含需要插入的值的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 :) }