一对多 - 续集更新 - 不删除/插入子项

时间:2016-06-20 12:56:49

标签: one-to-many sequelize.js

所以我现在一直在用一对多的映射更新来挣扎几个小时。

我有一个project具有某些tasks(例如)。 我通过前端添加和删除任务,并通过后续运行后续发送修改后的对象。

然后我尝试按如下方式更新记录:

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.createBulkTasks.destroy的情况下以一对多的关系正确地完成这项工作吗?

编辑包含模型 JSON对象如下所示:

{
    id: 1,
    projectName: 'nameOfTheProject',
    Tasks: [
        projectId: 1,
        name: 'taskName'
    ]
}

1 个答案:

答案 0 :(得分:1)

请尝试将嵌套到projectId对象的ProjectId对象的属性名称Tasks更改为projectToUpdate

<强>更新

Looking at sequelize's source,当您更新<时,似乎Instance.$save()函数(由您正在使用的Instance.$update()调用)不支持嵌套模型创建/ strong> it - 在执行之前检查标记wasNewRecord是否为true