SequelizeJS:批量设置外键

时间:2017-08-05 12:57:31

标签: javascript sql foreign-keys sequelize.js

我有两个模型,ArticleArticleGroup

sequelize.define('article', {
  GROUP_CODE: {
    type: DataTypes.STRING,
  },
  ...
}, {
  classMethods: {
    associate: function(models) {
      this.belongsTo(models.articleGroup);
    },
  },
});

...

sequelize.define('articleGroup', {
  GROUP_CODE: {
      type: DataTypes.STRING,
  },
  ...
});

我正在使用遗留数据,其中这两者之间的连接是使用GROUP_CODE字段建立的。我已经为article模型添加了一个外键。问题是当我尝试更新该外键时。这是我试图实现的代码:

let db = require('../models');

db.articleGroup.findAll().then((groups) => {
  groups.forEach((group) => {
    db.article.update({groupArticleId: group.id}, {where: {GROUP_CODE: group.GROUP_CODE}});
  });
});

使用此代码我得到了一堆:

...
Executing (default): UPDATE `article` SET `updatedAt`='2017-08-05 12:43:02' WHERE `GROUP_CODE` = '6'
Executing (default): UPDATE `article` SET `updatedAt`='2017-08-05 12:43:02' WHERE `GROUP_CODE` = '11'
Executing (default): UPDATE `article` SET `updatedAt`='2017-08-05 12:43:02' WHERE `GROUP_CODE` = '1'
...

它正在更新updatedAt但不更新groupArticleId字段。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:0)

执行该关联的代码如下:

Object.keys(db).forEach(function(modelName) {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

从未完成过,因为我的模型都没有associate属性。更改模型:

sequelize.define('article', {
  ...
}, {
  classMethods: {
    associate: function(models) {
      this.belongsTo(models.articleGroup);
    },
  },
});

为:

let Article = sequelize.define('article', {
  ...
});
Article.associate = function(models) {
  this.belongsTo(models.articleGroup);
}

return Article;

修复了我的问题,因为现在模型具有associate属性,并且可以正确关联,例如Sequelize将为外键创建getter和setter。