sequelize.js - Sequelize 属于ToMany 关系不起作用

标签 sequelize.js

首先,我用一个函数加载我的模型:

module.exports = function(config) {
  var db, files, modelPath, myDb, sequelize;
  sequelize = new Sequelize(config.database, config.username, config.password, {
    dialect: 'postgres',
    host: config.host,
    port: config.port,
    logging: false,
    define: {
      charset: 'utf8',
      collate: 'utf8_general_ci'
    }
  });
  db = {};
  modelPath = __dirname + "/models";
  files = fs.readdirSync(modelPath);
  _.each(files, function(file) {
    var model;
    if ('.coffee' === path.extname(file)) {
      model = sequelize["import"](path.join(modelPath, file));
      return db[model.name] = model;
    }
  });
  Object.keys(db).forEach(function(modelName) {
    if ('associate' in db[modelName]) {
      return db[modelName].associate(db);
    }
  });
  myDb = _.assign(db, {
    sequelize: sequelize,
    Sequelize: Sequelize
  });
  return myDb;
};

我有 2 个关联的模型:

module.exports = function(sequelize, DataTypes) {
  var User;
  User = sequelize.define('User', {
    name: {
      type: DataTypes.STRING,
      allowNull: false
    },
    username: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true
    },
    email: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true,
      validate: {
        isEmail: true
      }
    },
    password: {
      type: DataTypes.STRING,
      allowNull: false
    },
    status: {
      type: DataTypes.ENUM('active', 'inactive'),
      defaultValue: 'active'
    },
    api_key: {
      type: DataTypes.STRING,
      allowNull: true
    }
  }, {
    instanceMethods: {
      display: function() {
        var user;
        user = {
          name: this.name,
          email: this.email,
          username: this.username,
          active: this.active
        };
        return user;
      }
    }
  }, {
    classMethods: {
      associate: function(models) {
        return User.belongsToMany(models.Entity, {
          through: 'UserEntity'
        });
      }
    }
  });
  User.hook('beforeCreate', function(user, options, beforeCreateCb) {
    var uniqueKey;
    uniqueKey = (JSON.stringify(user)) + " " + (new Date()) + " " + (Math.random());
    user.api_key = crypto.createHash('md5').update(uniqueKey).digest('hex');
    return beforeCreateCb(null, user);
  });
  return User;
};

module.exports = function(sequelize, DataTypes) {
  var Entity;
  return Entity = sequelize.define('Entity', {
    name: {
      type: DataTypes.STRING,
      allowNull: false
    }
  }, {
    classMethods: {
      associate: function(models) {
        return Entity.belongsToMany(models.User, {
          through: 'UserEntity'
        });
      }
    }
  });
};

我通过以下方式找到了一个用户:

myDb.User.find({
  where: {
    username: 'snakamoto'
  }
}).then(function(dbUser) {
  var entities;
  should.exist(dbUser.id);
  entities = dbUser.getEntities();
  return done();
});

但是,我收到错误:TypeError: Object [object SequelizeInstance] has no method 'getEntities'

不知道我做错了什么。如果重要的话,我正在使用 2.0.1

最佳答案

这可能是自动复数的问题。 Sequelize 文档的以下部分可能包含解决此问题的提示:

http://docs.sequelizejs.com/en/latest/docs/associations/#naming-strategy

您可能需要告诉关联中的sequelize实体的复数形式是什么样的,在您的例子中是“Entities”。

祝你好运。

关于sequelize.js - Sequelize 属于ToMany 关系不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28480191/

相关文章:

sequelize.js - Sequelize 3 表 : lost with relations

express - 包含 where 条件,但在包含之前保留所有结果

javascript - 如何在 Sequelize 中使用 UNION ..?或者像 UNION 这样的任何其他方法都期望 promise.All...?

node.js - 在 google cloud sql nodejs 上定义 Sequelize

node.js - 使用不是 Sequelize.Model 子类的东西调用的 Sequelize 关联

node.js - 无法使用 TypeScript : Error: No Sequelize instance passed 导入 Sequelize 模型

postgresql - sequelize postgresql 更新迁移

javascript - 防止 Sequelize 记录器包含数据库凭据

mysql - 如何使用当前日期的 order by 进行查询

node.js - Console.log 打印 [Object SequelizeInstance :User]