是否可以一次更新父模型和关联模型的属性?我无法使其正常工作,并且无法找到任何完整的示例。我不确定我的代码是否有问题或是否没有按照我期望的方式工作。我尝试将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。类似的事情应该做你想要的:
build
Filter.find({ where: { id: 3 }, include: [ { model : FilteredContent, as : 'filteredContent' } ] }).then ( function( filter ) { return filter.filteredContent[0].updateAttributes({ content: 'crap' }) }).then(function () { // DONE! :) });
有关您整体发布的代码的几点建议:
编辑以回答您的评论:
您不能执行将同时更新过滤器内容和已过滤内容的单个函数调用,但是您也不必按顺序进行更新。您可以发出所有更新命令,而无需等待它们完成。
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转换为单独的参数。
spread
Promise.all