使用Sequelize更新关联模型中的属性

是否可以一次更新父模型和关联模型的属性?我无法使其正常工作,并且无法找到任何完整的示例。我不确定我的代码是否有问题或是否没有按照我期望的方式工作。我尝试将onUpdate:’cascade’添加到我的hasMany定义中,但这似乎无济于事。

楷模:

module.exports = function( sequelize, DataTypes ) {

var Filter = sequelize.define( 'Filter', {

id : {

type : DataTypes.INTEGER,

autoIncrement : true,

primaryKey : true

},

userId : DataTypes.INTEGER,

filterRetweets : DataTypes.BOOLEAN,

filterContent : DataTypes.BOOLEAN

},

{

tableName : 'filter',

timestamps : false

}

);

var FilteredContent = sequelize.define( 'FilteredContent', {

id : {

type : DataTypes.INTEGER,

autoIncrement : true,

primaryKey : true

},

filterId : {

type : DataTypes.INTEGER,

references : "Filter",

referenceKey : "id"

},

content : DataTypes.STRING

},

{

tableName : "filteredContent",

timestamps : false

}

);

Filter.hasMany( FilteredContent, { onUpdate : 'cascade', as : 'filteredContent', foreignKey : 'filterId' } );

sequelize.sync();

return {

"Filter" : Filter,

"FilteredContent" : FilteredContent

};

}

检索过滤器并尝试更新关联的FilteredContent对象上的属性:

Filter.find({   where: { id: 3 }, 

include: [ { model : FilteredContent, as : 'filteredContent' } ]

}).success ( function( filter ) {

var filteredContent = FilteredContent.build( {

filterId : filter.id,

id : 2,

content : 'crap'

});

filter.save();

});

这导致仅Filter对象中的属性被更新。如何获取它还更新FilteredContent中的属性?

另外,在定义模型后是否需要sequelize.sync()?我不清楚它到底应该做什么。我可以检索没有它的关联对象。我无奈地将其添加到我的代码中以使更新正常工作,但是我不确定是否确实必要。

谢谢

回答:

当您急切地加载FilteredContent(使用include)时,已经构建了一个模型实例,因此没有理由调用build。类似的事情应该做你想要的:

Filter.find({

where: { id: 3 },

include: [ { model : FilteredContent, as : 'filteredContent' } ]

}).then ( function( filter ) {

return filter.filteredContent[0].updateAttributes({

content: 'crap'

})

}).then(function () {

// DONE! :)

});

  • sequelize.sync为您的模型创建数据库表(如果尚不存在)。如果您的表已经存在,则不需要做什么
  • sequelize.sync是异步操作,因此不建议在不附加回调的情况下执行sequelize.sync。此外,看起来您正在模型定义中进行同步-您应该只执行一次,最好在定义模型的地方进行一次。
  • 看起来您在一个文件中定义了多个模型-您只应在每个文件中定义一个模型。可以通过在FilterContent文件中执行sequelize.import([过滤器模型的路径],或在将模型导入应用程序的地方进行所有关联来建立关联。

编辑以回答您的评论:

您不能执行将同时更新过滤器内容和已过滤内容的单个函数调用,但是您也不必按顺序进行更新。您可以发出所有更新命令,而无需等待它们完成。

Filter.find({

where: { id: 3 },

include: [ { model : FilteredContent, as : 'filteredContent' } ]

}).then ( function( filter ) {

return Promise.all([

filter.updateAttributes({}),

filter.filteredContent.map(fc => fc.updateAttributes({}))

]);

}).spread(function (filter, filteredContents) {

})

这样,所有查询将并行运行,并且所有查询完成后将调用then函数。请注意,我在spread这里已使用过将返回的数组Promise.all转换为单独的参数。

以上是 使用Sequelize更新关联模型中的属性 的全部内容, 来源链接: utcz.com/qa/428237.html

回到顶部