我不太确定该怎么称呼这个问题,但这里是我的设置:

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表中。
为此,我创建了以下内容:
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
我翻遍了文件,但还没有找到上面的一个例子(我觉得这很奇怪,因为这是很正常的情况)
简法
我试着用简优雅的方法解决它
但是我有个错误说:
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以创建this.dataValues实例-AcademyModule通常在promise处理程序中未定义。
嵌套创建可以更优雅地解决您的问题,它位于2.0.5中:https://github.com/sequelize/sequelize/pull/3386
首先,您需要从需求-->AcademyModule创建反向关联

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

这是必需的,因为需求是“主模型”,用于创建AcademyModule
requirements.academy_module = academy_module;

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

通过在requirements对象上设置this,并添加academy_module作为第二个参数(类似于为include使用includes的方式),这两个参数都将一次性创建并关联。
你需要稍微修改一下你的模型。使用当前的模型定义,表将包含一个find列,但是sequelzie不知道它是主键。您需要从需求模型中完全删除id(在这种情况下,sequentize将自动添加id并将其标记为主键),或者向其添加id
id: {
  type: DataTypes.INTEGER,
  primaryKey: true,
  autoIncrement: true // optional - only if you actually want AI :)
}

07-28 11:41