Как получить доступ к данным из таблицы сопоставления в graphql с помощью sequelize - PullRequest
0 голосов
/ 05 мая 2020

Я новичок в продолжении, у меня есть таблица пользователей, таблица адресов и таблица типов адресов, как указано ниже. пользователь может иметь 2 разных адрес , постоянный и текущий адрес, а тип адреса (постоянный или текущий) указывается в таблице тип адреса .

Я попытался получить доступ к данным из таблицы сопоставления (address_type) в резолвере на основе схемы и установил hasMany отношение из таблицы user -> address, но 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;
        }), 

1 Ответ

0 голосов
/ 06 мая 2020

Вы должны выключить опцию raw , чтобы получить связанные объекты, и использовать опцию include , чтобы указать, какие связанные модели вы sh загружаете.

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