2

我正在尝试使用 Sequelize + nodeJs 使用现有的 MySQL 数据库创建多对多关系:

下面是我的表: - “usr”表:usr_id(PK) - 中间“usr_role”:usr_id,role_id - “role”表:role_id

这是我的模型“用户”模型:

"use strict";
var bcrypt = require('bcryptjs');

 module.exports = function(sequelize, DataTypes) {

  var User = sequelize.define('User', {
    usrid  : {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        allowNull: false,
        field:'usr_id'
    },
    name :{
        type: DataTypes.STRING,
        allowNull: false,
        field:'usr_name'
    },

  }, {
    timestamps: false,
    freezeTableName: true,
    tableName: 'usr',
    name:'User',
    underscored:'true',

    classMethods: {
      associate:function(models){
        User.belongsToMany(models.Role, { through: 'UserRole', foreignKey:'usr_id', as:'UserRoles'});
      }

    }
  }
);
  return User;
};

“角色”模型

module.exports = function(sequelize, DataTypes) {
var Role = sequelize.define('Role', {
  id  : {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true,
      allowNull: false,
      field:'role_id'
  },
  name :{
      type: DataTypes.STRING,
      allowNull: false,
      field:'role_name'
  },

},{
  timestamps: false,
  freezeTableName: true,
  tableName: 'role_ref',
  underscored:'true',

  classMethods: {
    associate:function(models){
      Role.belongsToMany(models.User, {
        through: 'UserRole',
        foreignKey:'role_id'});
     }
  }
}
)
return Role;
};

E:\nodejsWS\learn\node_modules\inflection\lib\inflection.js:795
var str_path = str.split( '::' );
                    ^
TypeError: Cannot read property 'split' of undefined
at Object.inflector.underscore 
(E:\nodejsWS\learn\node_modules\inflection\lib\inflection.js:795:25)
at Object.module.exports.underscoredIf 
(E:\nodejsWS\learn\node_modules\sequelize\lib\utils.js:28:27)
at new BelongsToMany (E:\nodejsWS\learn\node_modules\sequelize
\lib\associations\belongs-to-many.js:134:15)
at Mixin.belongsToMany 
(E:\nodejsWS\learn\node_modules\sequelize\lib\associations
\mixin.js:264:21)
at sequelize.define.classMethods.associate 
(E:\nodejsWS\learn\models\Role.js:29:12)
at E:\nodejsWS\learn\models\index.js:50:21

这是我的 index.js

// Import models
  fs
    .readdirSync(__dirname)
    .filter(function(file) {
      return (file.indexOf(".") !== 0) && (file !== "index.js");
    })
    .forEach(function(file) {
      var model = sequelize.import(path.join(__dirname, file));
      db[model.name] = model;
    });

//associate models
  Object.keys(db).forEach(function(modelName) {
    if ("associate" in db[modelName]) {
      console.log(db);
      db[modelName].associate(db);
    }
  });

第 50 行引用 db[modelName].associate(db),这会导致错误。

有人可以指导我我做错了什么。我是否需要手动创建中间模型“UserRole”。非常感激你的帮助。谢谢。

4

1 回答 1

0

您需要在belongsToMany配置中指定实际中间表的名称,或者定义模型UserRole。此外,除非您的中间表具有字段,否则您可能还需要指定timestamps: false。因此,例如:

Role.belongsToMany(models.User, {
    through: 'usr_role',
    foreignKey:'role_id',
    timestamps: false
});

这将导致 sequelize 在其构建的查询中使用该表,而无需定义模型,并将阻止它从用户表或中间表请求时间戳字段。

于 2016-08-16T03:27:04.773 回答