Byron Lopez
Byron Lopez

Reputation: 303

findAll doesn't get object structure according to Includes Sequelize

I have tables like Medics, MedicalSpecialties and Users. Models are define like:

Users Model

const Database = require('../sequelize');

const UserModel = Database
  .getInstance()


.define('users', {
    UserId: {
      type: Database.FIELD_TYPE_ENUM.INTEGER,
      primaryKey: true,
      autoIncrement: true
    },
    FirstName: Database.FIELD_TYPE_ENUM.STRING,
    MiddleName: Database.FIELD_TYPE_ENUM.STRING,
    LastName: Database.FIELD_TYPE_ENUM.STRING,
    SecondLastName: Database.FIELD_TYPE_ENUM.STRING,
    ID: Database.FIELD_TYPE_ENUM.STRING,
    Email: Database.FIELD_TYPE_ENUM.STRING,
    Password: Database.FIELD_TYPE_ENUM.STRING,
    CellPhoneNumber: Database.FIELD_TYPE_ENUM.STRING,
    OtherPhoneNumber: Database.FIELD_TYPE_ENUM.STRING,
    Deleted: Database.FIELD_TYPE_ENUM.BOOLEAN
  });

module.exports = UserModel;

Medical Specialties Model

const Database = require('../sequelize');

const MedicalSpecialtyModel = Database
  .getInstance()
  .define('medicalspecialties', {
    MedicalSpecialtyId: {
      type: Database.FIELD_TYPE_ENUM.INTEGER,
      primaryKey: true,
      autoIncrement: true
    },
    Description: Database.FIELD_TYPE_ENUM.STRING,
    CreatedUserId: {
      type: Database.FIELD_TYPE_ENUM.INTEGER,
      references: {
        model: 'users',
        key: 'UserId'
      }
    },
    UpdatedUserId: {
      type: Database.FIELD_TYPE_ENUM.INTEGER,
      references: {
        model: 'users',
        key: 'UserId'
      },
      allowNull: true
    },
    createdAt: Database.FIELD_TYPE_ENUM.DATETIME,
    updatedAt: Database.FIELD_TYPE_ENUM.DATETIME
  });

module.exports = MedicalSpecialtyModel;

Medics Model

const Database = require('../sequelize');

const MedicModel = Database
  .getInstance()
  .define('medics', {
    MedicId: {
      type: Database.FIELD_TYPE_ENUM.INTEGER,
      primaryKey: true,
      autoIncrement: true
    },
    UserId: {
      type: Database.FIELD_TYPE_ENUM.INTEGER,
      primaryKey: true,
      autoIncrement: false,
      references: {
        model: 'users',
        key: 'UserId'
      }
    },
    MedicalSpecialtyId: {
      type: Database.FIELD_TYPE_ENUM.INTEGER,
      references: {
        model: 'medicalspecialties',
        key: 'MedicalSpecialtyId'
      }
    },
    Code: Database.FIELD_TYPE_ENUM.STRING,
    CreatedUserId: {
      type: Database.FIELD_TYPE_ENUM.INTEGER,
      references: {
        model: 'users',
        key: 'UserId'
      }
    },
    UpdatedUserId: {
      type: Database.FIELD_TYPE_ENUM.INTEGER,
      references: {
        model: 'users',
        key: 'UserId'
      },
      allowNull: true
    }
  });

module.exports = MedicModel;

What I want to do is to get results with object parent child Representation like

[
    {
        "MedicId": 1,
        "Code": "test1",
        "user": {
          "UserId": 4,
          "FirstName": "John",
          "MiddleName": null,
          "LastName": "Doe",
          "SecondLastName": null,
        },
        "medicalspecialty": {
          "MedicalSpecialtyId": 3,
          "Description": "Doctor"
        }
    }
]

But instead I'm getting this result:

[
    {
        "MedicId": 1,
        "Code": "test1",
        "user.UserId": 4,
        "user.FirstName": "John",
        "user.MiddleName": null,
        "user.LastName": "Doe",
        "user.SecondLastName": null,
        "medicalspecialty.MedicalSpecialtyId": 3,
        "medicalspecialty.Description": "Doctor"
    }
]

This is how I'm pulling data:

static getAllMedics() {
    MedicModel.belongsTo(MedicalSpecialtyModel, {
      foreignKey: 'MedicalSpecialtyId'
    });
    MedicModel.belongsTo(UserModel, {
      foreignKey: 'UserId'
    });
    UserModel.belongsTo(MedicModel);
    MedicalSpecialtyModel.hasMany(MedicModel);

    const attributes = ['MedicId', 'Code'];
    return MedicModel.findAll({
      attributes,
      include: [{
        model: UserModel,
        attributes: ['UserId', 'FirstName', 'MiddleName', 'LastName', 'SecondLastName'],
        where: {
          Deleted: false
        },
        required: true,
        nested: true
      }, {
        model: MedicalSpecialtyModel,
        attributes: ['MedicalSpecialtyId', 'Description'],
        required: true,
        nested: true
      }],
      raw: true
    });
  }

Hope you can help me.

Upvotes: 0

Views: 1207

Answers (2)

Byron Lopez
Byron Lopez

Reputation: 303

At the end it was my error.

When initializing Sequelize I had added the option row: true.

new Sequelize(..., { ..., row: true })

My apologies.

Upvotes: 1

Shivam
Shivam

Reputation: 3642

The raw property on a find call flattens the structure.

Basically do a find without raw: true.

You could get more info about it here

Upvotes: 4

Related Questions