最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

如何使用续集从graphql中的映射表访问数据

网站源码admin33浏览0评论

如何使用续集从graphql中的映射表访问数据

如何使用续集从graphql中的映射表访问数据

我是新手,我有一个用户表,地址表和地址类型表,如下所示。user可以有2个不同的address,分别是永久地址和当前地址,并且地址类型(permanent或current)在表address type中指定。

我已经尝试根据架构从解析器中的映射表(address_type)访问数据,并从用户->地址表设置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;
        }), 
回答如下:

您应该关闭选项raw以获取关联的对象,并使用include选项指示要加载的关联模型。

User.findAll( {
  where: { user_status: 1 },          
                include: [{ 
                  model: Address,
                  include: AddressType
                }],
                raw: false,
                nest: true,
        }
发布评论

评论列表(0)

  1. 暂无评论