使用Sequelize更新关联表数据的工作示例?

时间:2017-01-09 12:10:19

标签: javascript node.js sequelize.js

这是我的模特:



var Vote = sequelize.define('vote', {
    title: {
        type: Sequelize.STRING,
        allowNull: false
    },
    description: {
        type: Sequelize.TEXT
    }
});

var Choice = sequelize.define('choice', {
    choiceTitle: {
        type: Sequelize.STRING,
        allowNull: false
    },
    count: {
        type: Sequelize.INTEGER,
        length: 6
    }
});
Choice.belongsTo(Vote);
Vote.hasMany(Choice, {onUpdate: 'cascade'});




以下是更新“投票”的代码。表格包括相关的选项'如果可能的话使用'投票' ' store()'的论点已经是投票的对象,其中包含更新的值,包括'选择'来自应用程序。



store(vote, callback) {
    return Vote.findById(vote.id, {
        include: [
            {
                model: Choice,
                as: 'choices'
            }
        ]
    }).then(function(resVote) {
        resVote.choices[0].updateAttributes({count: 120}) // just to test if at least it gets written to db
            .then(function(res) {
                callback(null, res);
            }).catch((err) => callback(err, null));
    });
},




仅供参考:在代码中我只是将特定选项的一个属性设置为120,只是为了看它是否在postgres-db中写下来,而且,万岁,这是有效的(感谢Jan Aagaard的回复在Updating attributes in associated models using Sequelize上至少有关联表的更新。)

我在Sequelize的文档中找不到解决方案(至少他们有一些)。当我尝试保存()','更新()'或者' upsert()'直接投票它只是创建一个带有空字段的全新行,如果允许null,或者如果不允许null就会失败。

更新表的所有(已更改)字段的推荐方法是什么?如果可能,还有Sequelize中的关联表?对不起,如果这个问题有点基础,但我现在很困难,没有找到明确的答案。

1 个答案:

答案 0 :(得分:1)

您可以将include obj传递给创建(请参阅http://sequelize.readthedocs.io/en/v3/docs/associations/上的“使用关联创建”),但看起来您不能使用更新。

我认为您要做的是使用关系访问器获取相关记录Sequelize为您提供并更新这些实例:

 Vote.findById(vote.id)
  .then(function(vote) {
    return vote.getChoices()
  })
  .then(function(choices) {
    return choices[0].update({ count: 120 })
  })
  .then(function(choice) {
    callback(null, choice);
  })
  .catch(function(err) {
    callback(err);
  });

  (I realise this means you lose the join and end up with two separate queries, but I can't think another way of doing this just now)