在 Sequelize.js 中为多对多关系添加默认角色
Posted
技术标签:
【中文标题】在 Sequelize.js 中为多对多关系添加默认角色【英文标题】:Add default role to many-many relation in Sequelize.js 【发布时间】:2019-09-15 19:42:44 【问题描述】:我有两个Sequelize.js
模型,它们通过多对多关系连接。
用户:
module.exports = (sequelize, DataTypes) =>
const model = sequelize.define('User',
email:
type: DataTypes.STRING,
unique: true,
allowNull: false
,
password:
type: DataTypes.CHAR,
length: 60,
allowNull: false
);
model.associate = models =>
model.belongsToMany(models.Role,
hooks: true,
through: 'user_roles'
)
;
return model;
;
角色:
module.exports = (sequelize, DataTypes) =>
const model = sequelize.define('Role',
name:
type: DataTypes.STRING,
unique: false,
allowNull: false
);
model.associate = models =>
model.belongsToMany(models.User,
hooks: true,
through: 'user_roles'
);
;
return model;
;
表user_roles
是自动创建的。
在创建新的User
时,如何设置默认角色将插入到user_roles
中?有没有办法在模型定义中定义它,或者我只是应该创建 User
新用户,然后在一个事务中创建关系?
【问题讨论】:
【参考方案1】:首先,您需要在创建后为 user_roles 创建一个模型,您必须在您的用户模型中设置一个钩子,该钩子会自动将角色插入您的 user_roles 表中。
你可以这样做。
例如:
用户模型
const hooks = require('./user-role.hook');
module.exports = (sequelize, DataTypes) =>
const model = sequelize.define('User',
email:
type: DataTypes.STRING,
unique: true,
allowNull: false
,
password:
type: DataTypes.CHAR,
length: 60,
allowNull: false
, hooks );
model.associate = models =>
model.belongsToMany(models.Role,
hooks: true,
through: 'user_roles'
)
;
return model;
;
挂钩文件
exports.hooks =
afterCreate: (User, payload) =>
AddUserRole(User, payload);
function AddUserRole(User, payload)
let InsertArr =
user_id: User._id,
role_id: 1 // pass default role id
model.UserRole.create(InsertArr);
【讨论】:
很好,如果我需要在一笔交易中完成呢?有可能吗? 是的,如果您使用事务,则必须在创建用户后调用它,在这种情况下不要使用钩子。以上是关于在 Sequelize.js 中为多对多关系添加默认角色的主要内容,如果未能解决你的问题,请参考以下文章
Django admin - 如何在自定义管理表单中为多对多字段添加绿色加号