Sequelize值关联查询

一、介绍

很多博客都有关于这方面的介绍,对于初学者来说是比较看起来比较困难, 所以本文直接使用demo的方式进行演示

比较全面的介绍可看这边博客:https://blog.csdn.net/awhlmcyn/article/details/79816478

二、演示的场景

在RBAC权限管理模型中,需要三张表,role(角色表)、access(权限表)、role_access(角色权限关联表)

1、建立角色模型

module.exports = app => {
    const { STRING, INTEGER, DATE } = app.Sequelize;
  
    const Role = app.model.define('role', {
      id: { type: INTEGER, primaryKey: true},
      title: STRING,
      description: STRING,
      status:{
        type:INTEGER,
        defaultValue:0
      },
      created_at: DATE,
      updated_at: DATE,
      is_del:{
        type:INTEGER,
        defaultValue:0
      }
    });
  
    return Role;
  };

数据库表结构 

2、建立权限模型

 

module.exports = app=>{
    const { STRING, INTEGER, DATE } = app.Sequelize;
  
    const Access = app.model.define('access', {
      id: { type: INTEGER, primaryKey: true},
      moduleName: STRING,
      actionName:STRING,
      type: {
          type:INTEGER,
          defaultValue:0
      },
      url:STRING,
      modelId:STRING,
      sort:STRING,
      description:STRING,
      status:{
        type:INTEGER,
        defaultValue:0
      },
      created_at: DATE,
      updated_at: DATE,
      is_del:{
        type:INTEGER,
        defaultValue:0
      }
    },{
        freezeTableName: true  //直接查找设置的表名,默认是表名加s或者es
    });
  
    return Access;
}

数据库表结构

三、角色权限关联表


module.exports = app => {
  const { STRING, INTEGER, DATE } = app.Sequelize;

  const RoleAccess = app.model.define('role_access', {
    id: { type: INTEGER, primaryKey: true},
    // title: STRING,
    role_id: STRING,
    access_id:STRING,
    // description: STRING,
    status:{
      type:INTEGER,
      defaultValue:0
    },
    created_at: DATE,
    updated_at: DATE,
    is_del:{
      type:INTEGER,
      defaultValue:0
    }
  },{
    freezeTableName: true  //直接查找设置的表名,默认是表名加s或者es
  });

  return RoleAccess;
};

三、进行关联查询

(1) hasOne,用法A.hasOne(B,{})  一对一

例如、一个管理员需要确定他含有哪些权限,目前只限于查询权限的ID,由于角色权限关联表中含有角色ID

  Role.hasOne(RoleAccess,{
                // as: 'roleAccess',      //将关联的数据显示到该字段上
                foreginkey:"role_id",  //关联的外键
            })
        let result = await Role.findAll({
            // include:[{model:RoleAccess,as: 'roleAccess',}]
            include:[RoleAccess]
        })

查询结果是

(2)belongsTo ,用法是B.belongsTo(A,{})   一对一

例如:通过角色权限表反查角色,由于角色权限表中含有角色表的主键,所以角色权限属于角色

  RoleAccess.belongsTo(Role,{
                // as: 'roleAccess',      //将关联的数据显示到该字段上
                foreginkey:"role_id",  //关联的外键
            })
        let result = await RoleAccess.findAll({
            // include:[{model:RoleAccess,as: 'roleAccess',}]
            include:[Role]
        })

查询结果是

(3)hasMany,用法A.hasMany(b) 一对多

权限角色表数据

例如:一个角色有多种权限,如增加用户,删除用户等多种权限

 Role.hasMany(RoleAccess,{
            as: 'roleAccess',
            foreginkey:"role_id",
        })
        let result = await Role.findAll({
            include:[{model:RoleAccess,as: 'roleAccess',}]
        })

结果是

与hasOne的区别

 Role.hasOne(RoleAccess,{
                // as: 'roleAccess',      //将关联的数据显示到该字段上
                foreginkey:"role_id",  //关联的外键
            })
        let result = await Role.findAll({
            // include:[{model:RoleAccess,as: 'roleAccess',}]
            include:[RoleAccess]
        })

结果是

以上两种对比可以理解一对一,与一对多的含义,并不是指表的的一对一和一对多,而是每一条记录就一个模型,一对一、一对多是指模型 

(4) belongsToMany 多对多,用法

A.belongsToMany (C,{

foreginkey:"A_id",

through: B

})

C.belongsToMany (A,{

foreginkey:"C_id",

through: B

})

如、一个角色有很多权限,一种权限可能属于多个角色

 Access.belongsToMany(Role,{
            foreginkey:"role_id",
            through: RoleAccess
        })
        Role.belongsToMany(Access,{
            foreginkey:"access_id",
            through: RoleAccess
        })
        let result = await Role.findAll({
            include:[Access]
        })

结果是

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值