'Sequelize - ORM - Associations not working

Using Sequelize with MySQL. I have three models. Consultant, FamilyMember and Appointments. Appointment refers to Consultant and FamilyMember.

I have defined the foreign keys in the Appointment model. When the DB is created - the foreign keys are visible - when I check through a MySQL client, on the appointment table. The table names are freeze - so there isn't any chance of pluralization of the table names.

Consultant Model:

module.exports = (sequelize, DataTypes) => {
const consultant = sequelize.define('consultant', {
  ID: {
    type: DataTypes.UUID,
    primaryKey: true,
    allowNull: false
  },
  FirstName: {
    type: DataTypes.STRING,
    allowNull: false
  },
  LastName: {
    type: DataTypes.STRING,
    allowNull: false
  }
{
  freezeTableName: true 
}
);

return consultant;
};

Appointment Model:

module.exports = (sequelize, DataTypes) => {
const appointment = sequelize.define('appointment', {
  // attributes
  ID: {
    type: DataTypes.UUID,
    primaryKey: true,
    allowNull: false
  },
  ConsultantID: {
    type: DataTypes.UUID,
    allowNull: false,
    references: {         
      model: 'consultant',
      key: 'ID'
    }
  },
  FamilyMemberID: {
    type: DataTypes.UUID,
    allowNull: false,
    references: {         
      model: 'familymember',
      key: 'ID'
    }
  }
}, 
{
  freezeTableName: true 
}
);

appointment.associate = function (models) {
  models.appointment.belongsTo(models.consultant, {
    foreignKey: 'ConsultantID',
    as: 'consultant',
  });
  models.appointment.belongsTo(models.familymember, {
    foreignKey: 'FamilyMemberID',
    as: 'familymember',
  });
};

return appointment;
};

Family Member model:

module.exports = (sequelize, DataTypes) => {
const familymember = sequelize.define('familymember', {
  // attributes
  ID: {
    primaryKey: true,
    type: DataTypes.UUID,
    allowNull: false
  },
  FamilyID: {
    type: DataTypes.UUID,
    allowNull: false
  },
  FirstName: {
    type: DataTypes.STRING,
    allowNull: false
  },
  LastName: {
    type: DataTypes.STRING,
    allowNull: false
  }
}, 
{
  freezeTableName: true 
}
);
return familymember;
};

Then in the code I try to fetch appointment and get the related familymember and consultant like this

    var appointments = await Appointment.findAll({
        where: {
            AppointmentDateConfirmed: {
                $gte: moment().subtract(0, 'days').toDate()
              }
        }, include:[Consultant, FamilyMember]
    }
    )

However I get an error

UnhandledPromiseRejectionWarning: SequelizeEagerLoadingError: consultant is not associated to appointment!



Solution 1:[1]

I suppose you should register your associations after models registration like I pointed in this answer

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Anatoly