sequelize 保存关联的多个对象
sequelize saving multiple objects that assosiates
我不太确定如何称呼这个问题,但这是我的设置:
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'});
现在,正如您从我的 table 设置中看到的那样,我必须在 requirements
table 中保存一行,然后使用插入的 id
插入到academy_module
table.
为此我创建了以下内容:
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
函数中我无法访问包含需要插入的值的 academyModule
对象。
这对我来说是一个重复出现的问题,我真的很想知道如何连接,这样他们就可以自动连接而不用做小的事情 hacks
我已经搜索了文档,但我还没有找到上述的一个例子(我觉得很奇怪,因为这是一个相当正常的情况)
简氏方法
我尝试使用 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]
});
}
有趣的是我有协会:
AcademyModule.belongsTo(Requirements, {foreignKey: 'requirements_id'});
Requirements.hasOne(AcademyModule, {foreignKey: 'requirements_id'});
首先,我无法回答为什么您在访问 academyModule
时遇到问题 - 它应该可以通过简单的 javascript 范围界定来访问。
您的代码中有一些无法解释的部分...您正在向 associationPromises
推送一个承诺 - 为什么不只是 return 这个承诺?
您正在访问 this.dataValues
以创建一个 AcademyModule
实例 - this
通常在 promise 处理程序中未定义。
您的问题可以通过 2.0.5 中的嵌套创建更优雅地解决:https://github.com/sequelize/sequelize/pull/3386
首先你需要从 Requirements --> AcademyModule 创建反向关联
Requirements.hasOne(AcademyModule, {foreignKey: 'requirements_id'});
这是必需的,因为 Requirement 是 'main model',用于创建 AcademyModule
requirements.academy_module = academy_module;
Requirements.create(requirements, {
include: [AcademyModule]
});
通过在需求对象上设置 academy_module
,并添加 include
作为第二个参数(类似于您对 find
使用 includes 的方式),两者都一次性创建和关联.
您需要稍微修改您的模型。使用您当前的模型定义, table 将包含一个 id
列,但 sequelzie 不知道它是主键。您要么需要从 Requirements 模型中完全删除 id(在这种情况下,sequelize 会自动添加它并将其标记为主键),要么向其添加 primaryKey
:
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true // optional - only if you actually want AI :)
}
我不太确定如何称呼这个问题,但这是我的设置:
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'});
现在,正如您从我的 table 设置中看到的那样,我必须在 requirements
table 中保存一行,然后使用插入的 id
插入到academy_module
table.
为此我创建了以下内容:
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
函数中我无法访问包含需要插入的值的 academyModule
对象。
这对我来说是一个重复出现的问题,我真的很想知道如何连接,这样他们就可以自动连接而不用做小的事情 hacks
我已经搜索了文档,但我还没有找到上述的一个例子(我觉得很奇怪,因为这是一个相当正常的情况)
简氏方法
我尝试使用 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]
});
}
有趣的是我有协会:
AcademyModule.belongsTo(Requirements, {foreignKey: 'requirements_id'});
Requirements.hasOne(AcademyModule, {foreignKey: 'requirements_id'});
首先,我无法回答为什么您在访问 academyModule
时遇到问题 - 它应该可以通过简单的 javascript 范围界定来访问。
您的代码中有一些无法解释的部分...您正在向 associationPromises
推送一个承诺 - 为什么不只是 return 这个承诺?
您正在访问 this.dataValues
以创建一个 AcademyModule
实例 - this
通常在 promise 处理程序中未定义。
您的问题可以通过 2.0.5 中的嵌套创建更优雅地解决:https://github.com/sequelize/sequelize/pull/3386
首先你需要从 Requirements --> AcademyModule 创建反向关联
Requirements.hasOne(AcademyModule, {foreignKey: 'requirements_id'});
这是必需的,因为 Requirement 是 'main model',用于创建 AcademyModule
requirements.academy_module = academy_module;
Requirements.create(requirements, {
include: [AcademyModule]
});
通过在需求对象上设置 academy_module
,并添加 include
作为第二个参数(类似于您对 find
使用 includes 的方式),两者都一次性创建和关联.
您需要稍微修改您的模型。使用您当前的模型定义, table 将包含一个 id
列,但 sequelzie 不知道它是主键。您要么需要从 Requirements 模型中完全删除 id(在这种情况下,sequelize 会自动添加它并将其标记为主键),要么向其添加 primaryKey
:
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true // optional - only if you actually want AI :)
}