如何使用 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 突变中返回啥?

使用 Sequelize 在 GraphQL 查询中将日期时间字段输出为字符串

如何从服务器执行 GraphQL 查询

如何将查询逻辑添加到基于 graphql-sequelize 的设置?