更新模型时如何更新hasMany关联



有没有一种方法可以在一次调用中更新对象(组织(及其关联(tasg(?就我而言,我有Orgs->标签。一个组织可以有很多标签。

我不知道如何在一个简单的调用中更新标签和组织

function updateOrganization(db, stats) {
return function (req, res) {
let myOrg
db.organization.findOne({
where: {
id: req.params.id
},
include: ['tags']
})
.then(org => {
myOrg = org
let promises = []
if (req.body.tags) {
req.body.tags.forEach(tag => {
promises.push(org.createTag({ name: tag }))
})
}
return Promise.all(promises)
})
.then(tags => {
console.log('tags = ', tags)
return myOrg.setTags(tags) <-- DOES NOT SEEM TO BE WORKING
})
.then(updatedOrg => {
console.log('updatedOrg.get() = ', updatedOrg.get()) <-- DOES NOT CONTAIN NEW TAGS
console.log('myOrg final = ', myOrg.get()) <-- DOES NOT CONTAIN NEW TAGS
return res.status(HttpStatus.OK).send(myOrg)
})
.catch(err => {
req.log.error(err)
return handleErr(res, HttpStatus.INTERNAL_SERVER_ERROR, err.message)
})
}
}

注意:看起来promises.push(org.createTag({ name: tag }))行实际上是在创建标记,而return myOrg.setTags(tags)行不是必需的。当我使用findOne查询获取此记录时,所有标记实际上都存在。那么,为什么它们不出现在我的日志语句中,这是updatedOrg的输出?

您可以简单地使用这样的东西:

function updateOrganization(db, stats) {
return async (req, res) => {
try {
// Get the organization + associations
const org = await Organization.find({
where: { id: req.params.id },
include: ['tags'],
limit: 1, // added this because in the 4.42.0 version '.findOne()' is deprecated
});
// Check if we have any tags specified in the body
if(req.body.tags) {
await Promise.all(req.body.tags.map(tag => org.createTag({ name: tag })));
}
return res.status(HttpStatus.OK).send(org.reload()); // use '.reload()' to refresh associated data
} catch(err) {
req.log.error(err);
return handleErr(res, HttpStatus.INTERNAL_SERVER_ERROR, err.message);
}
}
}

你可以在这里阅读更多关于.reload()的信息。

此外,我建议您将来使用Sequelize Transactions,它将非常容易控制您的应用程序流。

您确定想要"hasMany"关系吗。通常标签是共享的,组织将具有"belongsToMany"关系。请发布您的模型和架构,如果可能的话,请发布一个工作示例(使用您的架构连接到数据库(或一个链接。

无论如何,我相信createTag只有在标签不存在的情况下才能工作。如果标记存在,则需要setTagsaddTags,传入标记对象或其主键ID。

最新更新