使用Sequelize与关联和范围包含在多个文件中

时间:2015-12-22 01:37:42

标签: node.js sequelize.js

我使用this way将我的Sequelize模型保存在单独的文件中,一切运行良好但现在我想出了包含其中包含范围的想法。

这样的事情不起作用:

@Entity
@DiscriminatorValue("CUSTOMER") // set the value of the column for customer location rows
public class CustomerLocationEntity extends LocationEntity {

}

...由于任务(当然)没有定义。即使使用var User = sequelize.define("User", {...}, { scopes: { complete: { include: [{ model: Task }] } } }); 而在此时也没有帮助,因为require('.').TaskUser之前加载,加载Task时,User不是尚未定义。

那么,有没有十几种变通方法的简单方法

  • 协会
  • 包含
  • 的范围
  • ...所有这些都在每个型号的单独文件中?

3 个答案:

答案 0 :(得分:8)

如果模型(任务)尚未加载? (在这种情况下,T出现在U之前并加载模型)。

.snapshotStream

成为

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

和模型

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

Object.keys(db).forEach(function(modelName) {
  if ("loadScopes" in db[modelName]) {
    db[modelName].loadScopes(db);
  }
});

变为

module.exports = function(sequelize, DataTypes) {
  var User = sequelize.define("User", {
    username: DataTypes.STRING
  }, {
    classMethods: {
      associate: function(models) {
        User.hasMany(models.Task)
      }
    }
  });

  return User;
};

答案 1 :(得分:1)

尝试使用Sequelize.models.Task

module.export = function(Sequelize, DataTypes){
  var User = sequelize.define("User", {...}, {
    scopes: {
      complete: {
        include: [{
          model: Sequelize.models.Task
        }]
      }
    }
  });
}

或者使用addScope()添加它们,而不必担心加载每个模型的顺序

答案 2 :(得分:1)

对于范围中的包含模型,使用addScope()方法更好。这是因为Sequelize模型是按字母顺序定义的,Model A首先位于Model B之前。当您在Model B范围内包含Model A时,Model A运行时Model B尚未定义。 addScope()方法解决了这个问题。

module.exports = function(sequelize, DataTypes) {
  const User = sequelize.define('User', {
    username: DataTypes.STRING
  }, { });

  User.associate = function(models) {
    // associations can be defined here
    User.hasMany(models.Task);

    // scopes should be defined here
    User.addScope('defaultScope', {
      include: [{ model: models.Task }],
    });

    // scopes with parameter
    User.addScope('byProfile', profileId => ({
      where: { profileId },
    }));
  };

  return User;
};

使用默认范围:

User.findAll(); 默认情况下,它将使用默认范围。

使用byProfile范围:

User.scope({ method: ['byProfile', profile.id] }).findAll();