如何使用 sequelize 从 graphql 中的映射表中访问数据
Posted
技术标签:
【中文标题】如何使用 sequelize 从 graphql 中的映射表中访问数据【英文标题】:How to access the data from mapping table in graphql using sequelize 【发布时间】:2020-08-20 05:56:44 【问题描述】:我是 sequelize 的新手,我有一个用户表、地址表和地址类型表,如下所示。 一个用户可以有2个不同的地址,永久地址和当前地址,地址类型(永久或当前)在表地址类型中指定强>。
我尝试根据架构从解析器中的映射表 (address_type) 访问数据,并从 user -> address table 设置 hasMany 关系,但 graphql 显示未找到关联错误。 我们如何才能正确地获取关系以便获取映射地址类型名称。
type User
id:Int
name:String
type Address
id: ID!
user_id:Int
city: String
addr_type:AddressType
type AddressType
id : Int
name:String (permanent|current)
表定义
module.exports = function(sequelize, DataTypes)
return sequelize.define('user',
id:
type: DataTypes.INTEGER, allowNull: false, primaryKey: true, autoIncrement: true
,
name:
type: DataTypes.INTEGER, allowNull: false,
,
,
tableName: 'user',
timestamps: false
);
;
module.exports = function(sequelize, DataTypes)
return sequelize.define('address',
id:
type: DataTypes.INTEGER, allowNull: false, primaryKey: true, autoIncrement: true
,
user_id:
type: DataTypes.INTEGER, allowNull: false, field:"addr_type"
,
addr_type:
type: DataTypes.INTEGER, allowNull: false, field:"addr_type"
,
city:
type: DataTypes.STRING, allowNull: false,
,
,
tableName: 'address',
timestamps: false
);
;
module.exports = function(sequelize, DataTypes)
return sequelize.define('address_types',
id:
type: DataTypes.INTEGER, allowNull: false, primaryKey: true, autoIncrement: true
,
name:
type: DataTypes.STRING, allowNull: false,
,
,
tableName: 'address_type',
timestamps: false
);
;
关系
db.user.hasMany(db.address,foreignKey: 'user_id');
db.address.belongsTo(db.user,foreignKey: 'user_id');
db.address.belongsTo(db.address_types,foreignKey: 'addr_type');
解析器代码
userts: async (obj, args, context, info ) => User.findAll(
where: user_status: 1 ,
,
raw: true,
nest: true,
).then(userts =>
const response = userts.map(usert =>
return
// i have 15 fields for a user, if i can access the schema of the corresponsing resolver i can dynamically build the response out put
id: usert.id,
firstName: usert.firstName,
lastName: usert.lastName,
middleName: usert.middleName,
)
return response;
),
【问题讨论】:
你能显示一个你试图执行的sequelize查询吗? 添加解析器代码@Anatoly 【参考方案1】:您应该关闭选项 raw 以获取关联对象并使用 include 选项指示您希望加载的关联模型。
User.findAll(
where: user_status: 1 ,
include: [
model: Address,
include: AddressType
],
raw: false,
nest: true,
【讨论】:
以上是关于如何使用 sequelize 从 graphql 中的映射表中访问数据的主要内容,如果未能解决你的问题,请参考以下文章
Sequelize with GraphQl:如何使用突变更新字段
使用 Jest、Graphql 和 Sequelize 测试数据库时如何避免 EADDRINUSE
我必须在带有 Sequelize 的 GraphQL 突变中返回啥?