【问题标题】:one to many - sequelize update - not removing/inserting children一对多 - 续集更新 - 不删除/插入孩子
【发布时间】: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.createBulkTasks.destroy 的情况下通过一对多关系正确完成这项工作?

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

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

【问题讨论】:

  • 现在可以给我们看一下projectToUpdate的内容吗?它是一个sequelize模型,还是只是一个普通的JS对象?谢谢
  • 这是一个来自前端的JSON对象。而已。即{name: "somename", Tasks: [..sometasks..] }(这当然是简化的)
  • 对,Tasks 列表中的对象的格式是什么?他们有ProjectId 的属性吗?很抱歉滥用,但如果您可以在运行时使用projectToUpdate 的合法 JSON 表示来更新您的问题,那就太好了
  • 编辑了我的问题并添加了我发送的模型的基本视图

标签: one-to-many sequelize.js


【解决方案1】:

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


更新

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

【讨论】:

  • 这真的没有意义,因为我的外键是 projectId (非大写)。反正我试过了,还是不行。
  • 表是sequelize创建的?或者你只是映射它们?因为我使用 sequelize 的所有时间 FK 都是默认使用 TitleCase 创建的。您是否尝试过额外的then 电话? .then(function (updateResult) { return updateResult.setTasks(projectToUpdate.Tasks, {transaction: t}) })
  • 在这种情况下,我会收到以下错误:val.replace is not a function
  • 我相信setTasks 只会尝试链接id,就像在many-to-many 中所做的那样。所以如果是这样的话,我别无选择,只能在匹配所述任务之前先创建或删除它们,不是吗?
  • 我的错误,我没有意识到您尝试分配的任务尚未插入数据库中。 Here 是创建嵌套模型的文档,但我看到你已经尝试过了。不同之处在于您正在尝试更新Project 添加新的Tasks,而文档示例正在创建两个模型的实例。但是,我发现的一个区别是您的Tasks 属性在projectToUpdate大写为T,而在文档中它们是小写的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多