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

Man*_*ieh 3 node.js sequelize.js

我正在使用这种方式将我的Sequelize模型保存在单独的文件中,一切都运行良好,但现在我想出了包含其中的范围的想法.

这样的东西不起作用:

var User = sequelize.define("User", {...}, {
  scopes: {
    complete: {
      include: [{
        model: Task
      }]
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

...因为任务(当然)没有定义.即使使用require('.').Task相反也没有帮助,因为User在加载之前TaskUser加载时加载,Task尚未定义.

那么,有一种简单易行的方法,没有十几种解决方法

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

小智 10

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

Object.keys(db).forEach(function(modelName) {
  if ("associate" in db[modelName]) {
    db[modelName].associate(db);
  }
});
Run Code Online (Sandbox Code Playgroud)

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);
  }
});
Run Code Online (Sandbox Code Playgroud)

和模型

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

  return User;
};
Run Code Online (Sandbox Code Playgroud)

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

      loadScopes: function(models) {
        User.addScope('complete', {
          include: [{
            model: models.Task
          }]
        })
      }

    }
  });

  return User;
};
Run Code Online (Sandbox Code Playgroud)


okw*_*vic 5

使用该addScope()方法更适合在范围内包含模型。这是因为 Sequelize 模型是按字母顺序定义的,Model AModel B. 当您包含Model BModel 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;
};
Run Code Online (Sandbox Code Playgroud)

使用默认范围:

User.findAll(); 这将默认使用默认范围。

使用byProfile范围:

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