gpt4 book ai didi

javascript - 从多对多关系中获取结果

转载 作者:行者123 更新时间:2023-12-02 21:41:35 27 4
gpt4 key购买 nike

我正在尝试从 GraphQL 解析器中的多对多关系(用户和 Angular 色之间)获取结果,但我对 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
};

这是我的 Angular 色模型:

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

所以基本上我的问题是我不知道应该如何编写查询来获取分配给一个用户的所有 Angular 色的列表。

我最终想要得到的(如用户类型定义中所示)是包含所有 Angular 色名称的字符串数组。

最佳答案

给定一个 User 实例,我们已经正确定义了与另一个模型的 HasManyBelongsToMany 关系,我们可以获得一个数组通过在我们的实例上调用适当的方法来关联模型。方法名称通常为 get[PLURAL_NAME_OF_MODEL](即 getRoles),但由于您为关系提供了 as 选项,因此该方法应为获取用户 Angular 色。因此,只需调用即可:

return obj.getUserRoles()

请注意,您还可以eager load根解析器中的关联模型。在这种情况下,如果 as 选项与您的字段名称匹配(即 as roles),您可以完全省略 roles 的解析器。如果您急于加载关联模型,但 as 与您的字段名称不匹配(如本例所示),那么您可以返回 obj[WHATEVER_THE_AS_OPTION_IS] (即 obj.UserRoles)。

编辑:由于 roles 是字符串列表而不是对象,因此我们需要执行以下操作:

const roles = await obj.getUserRoles()
return roles.map(role => role.name)

关于javascript - 从多对多关系中获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60354892/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com