如何通过 sequelize 获取用户角色?

Posted

技术标签:

【中文标题】如何通过 sequelize 获取用户角色?【英文标题】:How to get user-roles with sequelize? 【发布时间】:2020-07-27 01:53:44 【问题描述】:

我有一个这样的现实:

在我的解析器中,我正在获取这样的实体:

users: async () => 
  const users = await db.user.findAll(
    include: [
      
        model: db.userroles,
        include: [
          
            model: db.roles,
            attributes: ['Name'],
          ,
        ],
      ,
    ],
  );

我记录我从数据库中得到的信息:

 console.log('users are', users[0].dataValues.userroles[0].dataValues.role.Name); // logs "users are developer"

这表明我获取了正确的角色。

我的 graphql 架构:

  type user 
    Id: ID!
    Email: String
    RoleId: Int!
    Password: String
    ChangedPassword: Boolean
    WeddingId: Int!
    AttendantId: Int
    role: [roles!]
  

  type roles 
    Id: ID!
    Name: String!
  

在操场上我发送这个:

users
  role
  Name

结果:

  "data": 
    "users": [
      
        "role": null
      
    ]
  

当我记录从数据库返回的整个用户对象时:

users are userroles 
  dataValues:
    UserId: 1,
     RoleId: 1,
     role:
      roles 
        dataValues: [Object],
        _previousDataValues: [Object],
        _changed: ,
        _modelOptions: [Object],
        _options: [Object],
        isNewRecord: false  ,
  _previousDataValues:
    UserId: 1,
     RoleId: 1,
     role:
      roles 
        dataValues: [Object],
        _previousDataValues: [Object],
        _changed: ,
        _modelOptions: [Object],
        _options: [Object],
        isNewRecord: false  ,
  _changed: ,
  _modelOptions:
    timestamps: false,
     validate: ,
     freezeTableName: true,
     underscored: false,
     paranoid: false,
     rejectOnEmpty: false,
     whereCollection: null,
     schema: null,
     schemaDelimiter: '',
     defaultScope: ,
     scopes: ,
     indexes: [],
     name:  plural: 'userroles', singular: 'userrole' ,
     omitNull: false,
     tableName: 'userroles',
     sequelize:
      Sequelize 
        options: [Object],
        config: [Object],
        dialect: [mysqlDialect],
        queryInterface: [QueryInterface],
        models: [Object],
        modelManager: [ModelManager],
        connectionManager: [ConnectionManager],
        importCache: [Object] ,
     hooks:  ,
  _options:
    isNewRecord: false,
     _schema: null,
     _schemaDelimiter: '',
     include: [ [Object] ],
     includeNames: [ 'role' ],
     includeMap:  role: [Object] ,
     includeValidated: true,
     raw: true,
     attributes: undefined ,
  isNewRecord: false,
  role:
   roles 
     dataValues:  Name: 'Developer' ,
     _previousDataValues:  Name: 'Developer' ,
     _changed: ,
     _modelOptions:
       timestamps: false,
        validate: ,
        freezeTableName: true,
        underscored: false,
        paranoid: false,
        rejectOnEmpty: false,
        whereCollection: null,
        schema: null,
        schemaDelimiter: '',
        defaultScope: ,
        scopes: ,
        indexes: [],
        name: [Object],
        omitNull: false,
        tableName: 'roles',
        sequelize: [Sequelize],
        hooks:  ,
     _options:
       isNewRecord: false,
        _schema: null,
        _schemaDelimiter: '',
        include: undefined,
        includeNames: undefined,
        includeMap: undefined,
        includeValidated: true,
        raw: true,
        attributes: [Array] ,
     isNewRecord: false  

我得到了我只是不知道如何呈现的角色?

我认为问题出在我的解析器中,我缺少另一组包含但我不知道如何编写它。

【问题讨论】:

【参考方案1】:

userrolesuserRoles 作为联结表具有多对多关系。如果你还没有,应该在user上定义这个关系:

user.belongsToMany(roles,  through: userRoles )

这会让你直接include角色:

const users = await db.user.findAll(
  include: [
    db.roles,
  ],
);

【讨论】:

不知道这个,谢谢! 只是想到了一些东西,可能与上述工作无关,但只是出于好奇。不应该是 roles.belongsToMany(user, through: userRoles ) 吗? 关系总是单向的。对于多对多,您通常两者user.belongsToMany(roles) 允许您通过user.roles 访问用户的角色。 roles.belongsToMany(user) 允许您通过role.users 访问所有用户的角色。如果您不需要其中一个,则可以省略声明该关系。【参考方案2】:

发布后,我注意到架构中存在一些问题。

我将架构更改为:

  type roles 
    Id: ID!
    Name: String!
  

  type userroles 
    RoleId: ID!
    UserId: ID!
    role: roles
  

  type user 
    Id: ID!
    Email: String
    RoleId: Int!
    Password: String
    ChangedPassword: Boolean
    WeddingId: Int!
    AttendantId: Int
    userroles: [userroles!]
  

游乐场:

users
  userroles
  role
  Name

结果:

  "data": 
    "users": [
      
        "userroles": [
          
            "role": 
              "Name": "Developer"
            
          
        ]
      
    ]
  

答案让我眼前一亮,但我专注于解析器中的代码。

留下这个问题,以防有人有其他方法。

【讨论】:

更改名称...类型大写,属性/字段小写...type User id: ID!, changedPassword ... 事情是我正在使用 sequelize-auto,它会生成所有带有 lovercase 的表名。 这不是 sequelize-auto 故障 - 现有数据库名称(重命名数据库表?)...至少您可以使用 -C, --camel Use camel case to name models and fields

以上是关于如何通过 sequelize 获取用户角色?的主要内容,如果未能解决你的问题,请参考以下文章

从多对多关系中获取结果

在 Sequelize.js 中为多对多关系添加默认角色

Sequelize - 如何从一个表中获取未被另一表关联的条目

如何使用 Spring Security 获取当前用户的角色

如何在使用实体框架时获取所有用户角色

sequelize 中的引用字段是啥?