Я пытаюсь получить результаты от отношения «многие ко многим» (между пользователями и ролями) в распознавателе GraphQL, но я совсем новичок в Sequelize и не понимаю, как правильно запрашивать модель.
Вот моя модель пользователя:
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define('users', {
id: {
type: DataTypes.INTEGER(10).UNSIGNED,
allowNull: false,
primaryKey: true,
autoIncrement: true
},
name: {
type: DataTypes.STRING(50),
allowNull: false
},
surname: {
type: DataTypes.STRING(50),
allowNull: false
},
email: {
type: DataTypes.STRING(256),
allowNull: false
}
}, {
tableName: 'users',
timestamps: false,
});
User.associate = function (models) {
User.belongsToMany(models.roles, {as: 'UserRoles', through: 'users_roles', foreignKey: 'user_id'})
};
return User
};
Вот моя модель ролей:
module.exports = function(sequelize, DataTypes) {
var Role = sequelize.define('roles', {
id: {
type: DataTypes.INTEGER(10).UNSIGNED,
allowNull: false,
primaryKey: true,
autoIncrement: true
},
name: {
type: DataTypes.STRING(50),
allowNull: false
}
}, {
tableName: 'roles',
timestamps: false,
});
Role.associate = function (models) {
Role.belongsToMany(models.users, {through: 'users_roles', foreignKey: 'role_id'})
};
return Role
};
А вот моя модель таблицы соединений:
module.exports = function(sequelize, DataTypes) {
return sequelize.define('users_roles', {
id: {
type: DataTypes.INTEGER(10).UNSIGNED,
allowNull: false,
primaryKey: true,
autoIncrement: true
},
user_id: {
type: DataTypes.INTEGER(10).UNSIGNED,
allowNull: false,
references: {
model: 'users',
key: 'id'
}
},
role_id: {
type: DataTypes.INTEGER(10).UNSIGNED,
allowNull: false,
references: {
model: 'roles',
key: 'id'
}
}
}, {
tableName: 'users_roles',
timestamps: false
});
};
На данный момент это мое определение GraphQL:
import { gql } from 'apollo-server-express'
import * as db from '../database'
export const typeDefs = gql`
extend type Query {
users: [User]
user(id: ID!): User
}
type User {
id: ID!
email: String
name: String
surname: String
roles: [String]
}
`
export const resolvers = {
Query: {
users: async () => db.users.findAll(),
user: async (obj, args, context, info) => db.users.findByPk(args.id),
},
User: {
roles: async (obj, args, context, info) => db.roles.findAll(), // wrong!!
}
}
Итак, в основном моя проблема заключается в том, что я не понимаю, как написать запрос, чтобы получить список всех ролей, назначенных одному пользователю.
В конце я бы хотел получить (как показано в определении типа пользователя) массив строк, содержащий все имена ролей.