【发布时间】:2020-06-06 20:12:37
【问题描述】:
我试图从 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!!
}
}
所以基本上我的问题是我不知道应该如何编写查询来获取分配给一个用户的所有角色的列表。
我最终想要得到的是一个包含所有角色名称的字符串数组(如用户类型定义中所示)。
【问题讨论】:
-
从版本 3 开始不支持使用
classMethods,最新版本已经是版本 6。您应该关注extensive documentation and examples available,而不是关注其他可能已经过时的教程。 -
@DanielRearden 正如我所说,我对 Sequelize 不太熟悉。经过广泛的谷歌搜索,看起来在各种文件中定义的模型之间进行关联似乎很复杂,正如this page 所示......我从那里得到了关联方法解决方案。
-
@DanielRearden 无论如何,我已经更新了我的代码,从用户和角色中删除了 classMethods(请参阅问题中更新的 sn-ps)。我已经检查了一个 console.log 并且这些方法确实被调用了。感谢您的提醒。
标签: javascript node.js graphql sequelize.js apollo-server