Sequelize.js渴望在多对多表中加载

时间:2015-06-20 14:40:58

标签: node.js sequelize.js

我有两个表,User和MControllers。它们通过名为History的另一个表具有多对多关系,定义如下:

var History = sequelize.define("History", {
id: {
  type: DataTypes.INTEGER,
  primaryKey: true,
  autoIncrement: true
},
message: {
  type : DataTypes.STRING,
  allowNull : false
}
}, {
timestamps: true,
updatedAt: false,
classMethods: {
  associate: function(models) {
  }
}
});

我已经建立了这样的协会:

MController.belongsToMany(User, {through: History, onDelete: 'cascade' });
User.belongsToMany(MController, {through: History, onDelete: 'cascade' });

现在,我需要使用User表的eager-loading来查询History表。像这样:

historyEntity.findAll({
        where : {
            MControllerId : mcontrollerId
        },
        include : {
            model : this.User
        }
    });

但我收到以下错误:

[Error: User is not associated to History!]

如果我检查历史模型,它实际上没有任何关联。 如何使此查询成为可能?

编辑: 我尝试查询Users表,急切加载History表,但没有成功。它告诉我用户与历史记录无关,事实并非如此,因为我已经检查了用户模型并且说:

{ History: [Object],
    UserMController: [Object],
    OauthAccessTokensUsers: [Object],
    OauthRefreshTokensUsers: [Object] },

2 个答案:

答案 0 :(得分:1)

在讨论了您对@Renan的需求后,我建议您将User模型与MController关联两次,一个为User,另一个为Activator。< / p>

// normal users
MController.belongsToMany(User, {through: 'MControllerUsers', onDelete: 'cascade' });
User.belongsToMany(MController, {through: 'MControllerUsers', onDelete: 'cascade' });

// activator users
MController.belongsToMany(User, {through: 'MControllerActivators', onDelete: 'cascade', as: 'Activator' });
User.belongsToMany(MController, {through: 'MControllerActivators', onDelete: 'cascade', as: 'Activator' });

通过这种方式,您可以将相同的模型User链接到MController并具有两个不同的角色,从而允许每个MController拥有多个UserActivator个< / p>

答案 1 :(得分:0)

观看您的关联,为什么您有models.User,而其他地方只有User?检查是否有问题。

如果没有,我使用

解决了这个问题

History.hasOne(MController); History.hasOne(User);