在 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 - 如何在自定义管理表单中为多对多字段添加绿色加号

如何在 Rails 4.2 中为多对多关联创建表单

如何在 Django 中向多对多关系中添加字段?

在 Django 中为多对多字段冲突反向访问器和查询?

如何在 Rails 4 中为多对多关联制作带有子表单的表单?

如何在 Django REST 框架中为多对多字段定义“IsOwner”自定义权限?