简体   繁体   中英

sequelize hasMany, how to use customized foreginKey

Model EmployeeView

module.exports = function(sequelize, DataTypes) {
  var _this = sequelize.define('EmployeeView', {
    employeeId: {
      type: DataTypes.INTEGER,
      field: 'code'
    },
    username: DataTypes.STRING,
    email: {
      type: DataTypes.STRING,
      field: 'emailaddress'
    },
    department: {
      type: DataTypes.STRING,
      field: 'department_name'
    },
    departmentId: {
      type: DataTypes.STRING,
      field: 'departments_id'
    }
  }, {
    timestamps: false,
    freezeTableName: true,
    tableName: 'employees_view',
    classMethods: {
      associate: function(models) {
        _this.belongsTo(models.EmployeeCategory, {
          foreignKey: {
            name: 'employeecategories_id'
          }
        });
        _this.hasMany(models.EmployeeFile, {
          foreignKey: 'employees_code'
        });
      }
    }
  });
  return _this;
};

Model EmployeeFile

module.exports = function(sequelize, DataTypes) {
  var _this = sequelize.define("EmployeeFile", {
    employeeId: {
      type: DataTypes.INTEGER,
      field: 'employees_code'
    },
    filename: {
      type: DataTypes.STRING,
      filed: 'filename'
    },
    employeeFileTypeId: {
      type: DataTypes.INTEGER,
      field: 'employee_file_types_id'
    }
  }, {
    timestamps: false,
    freezeTableName: true,
    tableName: 'employee_files'
  });

  return _this;
};

Router

router.get('/employee', function(req, res) {
  models.EmployeeView.findAll({
    where: {
      active: req.query.active
    }
    include: [{
      model: models.EmployeeCategory
    }, {
      model: models.EmployeeFile,
       }]
  }).then(function(employee) {
    res.json(employee);
  });
});

What do I expect to happen?

I have two tables ' employee_view ' ( it is a view ) and ' employee_files ' which map to the ' EmployeeView ' and ' EmployeeFile '. ' employee_view ' has ' id ' field as the primary key and ' code ' field as the employee number.' employee_files ' has ' employees_code ' as its primary key and foreignKey which bindings with the ' code ' field. So I want to get ' employee_files ' data through this relation.

What is actually happening?

Actually,I got nothing. Because the sequelize will execute "EmployeeView.id == EmployeeFile.employees_code". But I want the sequelize to execute "EmployeeView.code == EmployeeFile.employees_code" .What should I do?

just add primaryKey: true to your employeeId field to link the EmployeeView to EmployeeFiles since the belongsToMany relationship will only link to the primary key of it's parent

employeeId: {
  type: sequelize.INTEGER,
  field: 'code',
  primaryKey: true
},

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM