【问题标题】:sequelize saving multiple objects that assosiatessequelize 保存关联的多个对象
【发布时间】:2015-03-24 16:37:41
【问题描述】:

我不太确定如何称呼这个问题,但这是我的设置:

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

我已经搜索了文档,但我找不到上述的一个例子(我觉得这很奇怪,因为这是一种相当正常的情况)

简的方法

我尝试使用 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'});

【问题讨论】:

    标签: javascript mysql node.js sequelize.js


    【解决方案1】:

    首先,我无法回答为什么您在访问 academyModule 时遇到问题 - 它应该可以通过简单的 javascript 作用域获得。

    您的代码中有一些无法解释的部分...您正在向 associationPromises 推送一个承诺 - 为什么不直接返回该承诺?

    您正在访问 this.dataValues 以创建 AcademyModule 实例 - this 通常在 Promise 处理程序中未定义。

    嵌套创建可以更优雅地解决您的问题,在 2.0.5 中:https://github.com/sequelize/sequelize/pull/3386

    首先你需要从需求创建反向关联 --> AcademyModule

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

    这是必需的,因为 Requirement 是用于创建 AcademyModule 的“主模型”

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

    通过在需求对象上设置academy_module,并将include 添加为第二个参数(类似于您对find 使用includes 的方式),两者都可以一次性创建和关联。

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

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

    【讨论】:

    • 嘿@Jan 首先谢谢你的回答我正在尝试用你优雅的方式解决这个问题但是我遇到了一个问题我更新了我的答案你能看看:)吗?
    • 需要设置反向关联(要求hasMany / hasOne AcademyModule)
    • 我更新了我的代码,所以你可以看到我添加的需求它仍然没有添加(但是在更改后它确实插入到需求表中)
    • 我已经添加了您的代码,但它只在需求表中添加了一行,而不是在 academy_module 中
    • 嗯,那肯定是别的东西。我已经逐字尝试了您发布的模型和代码,它对我来说效果很好。也许您可以尝试在应用程序代码之外将问题重新创建为单独的测试用例,并在 github 上将失败的测试作为 PR 提供?
    猜你喜欢
    • 1970-01-01
    • 2014-04-15
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多