Sequelize OneToMany-ManyToOne关系管理

时间:2020-01-16 22:22:48

标签: node.js sequelize.js associations

我正在尝试使用Sequelize实现一个简单的示例,这是我的两个模型:
-可以有多个Todolists的用户
-Todolist属于一个用户

'use strict';
module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
    email: DataTypes.STRING
  }, {});
  User.associate = function(models) {
    User.hasMany(models.Todolist)
  };
  return User;
};
'use strict';
module.exports = (sequelize, DataTypes) => {
  const Todolist = sequelize.define('Todolist', {
    title: DataTypes.STRING,
    completed: DataTypes.BOOLEAN
  }, {});
  Todolist.associate = function(models) {
    // associations can be defined here
    Todolist.belongsTo(models.User,{
      onDelete: "CASCADE",
      foreignKey: {
        allowNull: false
      }
    });
  };
  return Todolist;
};

我创建了一些虚拟数据:

models.User.create({
        firstName: 'TEST',
        lastName: 'Test',
        email: 'doe@somemail.com',
        Todolists: [
            {
                title: 'Todolist 1',
                completed: 1
            },
            {
                title: 'Todolist 2',
                completed: 0
            }
        ]
    }, {
        include: [models.Todolist]
    }
    )

工作正常,然后我尝试使用一些新创建的Todolists更新用户的Todolists:

models.User.findByPk(1, { include: models.Todolist }).then(
        (user) => {
            if (user) {
                models.Todolist.bulkCreate(
                    [
                        {
                            UserId: user.id,
                            title: 'TESING',
                            completed: true
                        },
                        {
                            UserId: user.id,
                            title: 'TESING2',
                            completed: true
                        }
                    ]
                ).then(todolists => {
                    user.setTodolists(todolists).then(
                        result => console.log(result.get({ plain: true }))
                    )
                }).catch(err => console.log(err))
            }
        }
    );

在这里,我得到一个奇怪的结果:

Executing (default): SELECT `User`.`id`, `User`.`firstName`, `User`.`lastName`, `User`.`email`, `User`.`createdAt`, `User`.`updatedAt`, `Todolists`.`id` AS `Todolists.id`, `Todolists`.`title` AS `Todolists.title`, `Todolists`.`completed` AS `Todolists.completed`, `Todolists`.`createdAt` AS `Todolists.createdAt`, `Todolists`.`updatedAt` AS `Todolists.updatedAt`, `Todolists`.`UserId` AS `Todolists.UserId` FROM `Users` AS `User` LEFT OUTER JOIN `Todolists` AS `Todolists` ON `User`.`id` = `Todolists`.`UserId` WHERE `User`.`id` = 1;
Executing (default): INSERT INTO `Todolists` (`id`,`title`,`completed`,`createdAt`,`updatedAt`,`UserId`) VALUES (NULL,'TESING',1,'2020-01-16 22:10:10.217 +00:00','2020-01-16 22:10:10.217 +00:00',1),(NULL,'TESING2',1,'2020-01-16 22:10:10.217 +00:00','2020-01-16 22:10:10.217 +00:00',1);
Executing (default): SELECT `id`, `title`, `completed`, `createdAt`, `updatedAt`, `UserId` FROM `Todolists` AS `Todolist` WHERE `Todolist`.`UserId` = 1;
Unhandled rejection SequelizeValidationError: notNull Violation: Todolist.UserId cannot be null

因此,我收到验证错误,提示存在违反空ID约束的情况。
同样,以UserId = 1插入已创建的Todolists。 这是插入新的Todolists之后的上述SELECT代码的结果:

Executing (default): SELECT `User`.`id`, `User`.`firstName`, `User`.`lastName`, `User`.`email`, `User`.`createdAt`, `User`.`updatedAt`, `Todolists`.`id` AS `Todolists.id`, `Todolists`.`title` AS `Todolists.title`, `Todolists`.`completed` AS `Todolists.completed`, `Todolists`.`createdAt` AS `Todolists.createdAt`, `Todolists`.`updatedAt` AS `Todolists.updatedAt`, `Todolists`.`UserId` AS `Todolists.UserId` FROM `Users` AS `User` LEFT OUTER JOIN `Todolists` AS `Todolists` ON `User`.`id` = `Todolists`.`UserId` WHERE `User`.`id` = 1;
{
  id: 1,
  firstName: 'TEST',
  lastName: 'Test',
  email: 'doe@somemail.com',
  createdAt: 2020-01-16T22:08:35.434Z,
  updatedAt: 2020-01-16T22:08:35.434Z,
  Todolists: [
    {
      id: 1,
      title: 'Todolist 1',
      completed: true,
      createdAt: 2020-01-16T22:08:35.599Z,
      updatedAt: 2020-01-16T22:08:35.599Z,
      UserId: 1
    },
    {
      id: 2,
      title: 'Todolist 2',
      completed: false,
      createdAt: 2020-01-16T22:08:35.600Z,
      updatedAt: 2020-01-16T22:08:35.600Z,
      UserId: 1
    },
    {
      id: 3,
      title: 'TESING',
      completed: true,
      createdAt: 2020-01-16T22:10:10.217Z,
      updatedAt: 2020-01-16T22:10:10.217Z,
      UserId: 1
    },
    {
      id: 4,
      title: 'TESING2',
      completed: true,
      createdAt: 2020-01-16T22:10:10.217Z,
      updatedAt: 2020-01-16T22:10:10.217Z,
      UserId: 1
    }
  ]
}

TLDR:
-我无法更新用户模型并设置其关联的Todolist模型
-我收到NULL id约束验证错误,但Sqlite仍插入项目而不删除前一个项目(因为使用setTodolist()方法时应该发生这种情况)

任何有关如何更新此模型与其关联的帮助/见解将不胜感激。

0 个答案:

没有答案