【发布时间】:2016-06-24 21:34:29
【问题描述】:
所以我已经为一对多映射更新苦苦挣扎了几个小时。
我有一个project,其中有一定的tasks(例如)。
我通过前端添加和删除任务,并通过运行 sequelize 的后端将修改后的对象发送到。
然后我尝试更新记录如下:
return models.Project
.findOne({
where: { id: projectToUpdate.id },
include: [models.Task]
})
.then(function (ProjectFromDb) {
return models.sequelize
.transaction({
isolationLevel: models.sequelize.Transaction.ISOLATION_LEVELS.READ_COMMITTED
},
function (t) {
return ProjectFromDb
.update(projectToUpdate,
{
include: [{ model: models.Task }]
})
});
})
.then(function (result) {
return output.getSuccessResult(....
})
.catch(function (error) {
return output.getErrorResult(....
});
但这只会更新Project
接下来我尝试通过额外的then 调用来更新它们:
.then(function (updateResult) {
return updateResult.setTasks(projectToUpdate.Tasks, {transaction: t})
})
但这会给我的结果是他正在尝试更新Task 并将ProjectId 设置为NULL,这是不可能的,因为它不可为空。
我目前正在“手动”添加 tasks 并删除它们,但这似乎是使用框架的一种愚蠢方式。
谁能告诉我如何在不调用Tasks.createBulk 和Tasks.destroy 的情况下通过一对多关系正确完成这项工作?
编辑以包含模型 JSON 对象如下所示:
{
id: 1,
projectName: 'nameOfTheProject',
Tasks: [
projectId: 1,
name: 'taskName'
]
}
【问题讨论】:
-
现在可以给我们看一下
projectToUpdate的内容吗?它是一个sequelize模型,还是只是一个普通的JS对象?谢谢 -
这是一个来自前端的JSON对象。而已。即
{name: "somename", Tasks: [..sometasks..] }(这当然是简化的) -
对,
Tasks列表中的对象的格式是什么?他们有ProjectId的属性吗?很抱歉滥用,但如果您可以在运行时使用projectToUpdate的合法 JSON 表示来更新您的问题,那就太好了 -
编辑了我的问题并添加了我发送的模型的基本视图