Как получить пользовательские роли с помощью sequelize? - PullRequest
2 голосов
/ 14 апреля 2020

У меня есть такое представление:

enter image description here

в моем резольвере Я получаю данные вроде этого:

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 } }

Я получаю роли, которые я просто не могу понять, как их представить?

Я думаю, что проблема в моем решателе, что мне не хватает еще одного набора включений, но я не могу понять, как написать его.

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

user и roles имеют отношение «многие ко многим» с userRoles в качестве таблицы соединений. Если вы этого еще не сделали, следует определить это отношение на user:

user.belongsToMany(roles, { through: userRoles })

. Это позволит вам include ролям напрямую:

const users = await db.user.findAll({
  include: [
    db.roles,
  ],
});
1 голос
/ 14 апреля 2020

После публикации я заметил некоторые проблемы в моей схеме.

Я изменил свою схему на:

  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"
            }
          }
        ]
      }
    ]
  }
}

Ответ посмотрел мне прямо в лицо, но я был сосредоточен на коде в резольвере.

Оставив этот вопрос, если у кого-то есть другой способ сделать это.

...