findAll不会根据包含Sequelize获得对象结构

时间:2017-08-24 20:10:06

标签: node.js sequelize.js

我有MedicsMedicalSpecialtiesUsers等表格。模型定义如下:

用户模型

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;

医疗专业模型

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;

医务人员模型

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;

我想要做的是使用对象父子代表获取结果

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

但我得到了这个结果:

[
    {
        "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"
    }
]

这就是我提取数据的方式:

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
    });
  }

希望你能帮助我。

2 个答案:

答案 0 :(得分:2)

查找调用上的raw属性会使结构变平。

基本上在没有raw: true的情况下进行查找。

您可以获得有关它的更多信息here

答案 1 :(得分:1)

最后是我的错误。

初始化Sequelize时,我添加了选项row: true

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

道歉。