我正在尝试使用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()方法时应该发生这种情况)
任何有关如何更新此模型与其关联的帮助/见解将不胜感激。