我创建了一个示例 Express/Sequelize/sqlite 应用程序,但在关联模型时遇到了一个奇怪的问题。我的架构如下:
一个角色可以有多个用户。
角色模型:
module.exports = (sequelize, DataTypes) => {
const Role = sequelize.define("Role", {
name: {
type: DataTypes.STRING,
allowNull: false
},
shortName: {
type: DataTypes.STRING,
allowNull: false
}
});
Role.associate = function(models) {
// associations can be defined here
Role.hasMany(models.User, {
as: "Users",
foreignKey: "role_id",
sourceKey: "id"
});
};
return Role;
};
用户模型
"use strict";
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define("User", {
firstName: {
type: DataTypes.STRING,
allowNull: false
},
lastName: {
type: DataTypes.STRING,
allowNull: false
},
email: {
type: DataTypes.STRING,
allowNull: false
},
username: {
type: DataTypes.STRING,
allowNull: false
},
password: DataTypes.STRING
});
User.associate = function(models) {
// associations can be defined here
User.belongsTo(models.Role, {
as: "Role",
foreignKey: "role_id",
targetKey: "id"
});
};
return User;
};
用法
现在我尝试创建一个角色和一个用户并将它们关联起来
let adminRole = await models.Role.create({
name: "Admin",
shortName: "A"
});
let john = await models.User.build({ // Step 1
firstName: "John",
lastName: "Doe",
email: "John@doe.com",
username: "john",
password: "this_should_be_encypted"
});
await john.setRole(adminRole); // Step 2
await john.save(); // Step 3
INSERT INTO
用户 (
role_id ,
updatedAt ,
createdAt ) VALUES (1, ...
。大概是为了创建一个具有正确角色 ID 的用户条目。 由于违反了非空约束,这会生成一个异常。
如果我更改第 2 步和第 3 步的顺序,它会起作用 - 创建用户条目,然后建立关联。
但是如果 role_id 也不能为空,我该怎么办?
然后是一个真正的鸡和蛋的情况。
我该怎么做才能避免这种情况?我唯一能想到的就是手动设置 role_id ,但这与 ORM 的想法背道而驰。
最佳答案
在这里做这个。
await john.setRole(adminRole, {save: false}); // Step 2
await john.save(); // Step 3
关于sequelize.js - Sequelize、关系和必需的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55013207/