Sequalize 中两个表之间具有多种类型的多对多关系

Ash*_*thi 4 javascript database mariadb node.js sequelize.js

我正在使用 Sequelize for Node,并且我有用户和项目。用户可以通过多种方式与项目交互,例如投票或推荐(在本例中是两种不同的方式)。

我最初的想法是拥有两个不同的多对多关系,但 Sequelize 只有一个 removeItem 调用,而且我还没有弄清楚如何指定哪个。

计划 2 是构建一个具有额外元素“类型”的多对多表,以便我可以指定类型。我可以在添加东西时指定类型。这遇到了两个问题,一是它们是外键,二是默认情况下这使得该对唯一。我通过从数据库中手动删除约束来纠正这个问题,这似乎就足够了(我将 id 设置为主键自动增量)。其次,我似乎无法弄清楚如何使删除指定 type = 我想要的类型。

代码:

要构建表:

  var UserActions = sequelize.define('userActions', {
id: {
  type: DataTypes.INTEGER,
  primaryKey: true,
  autoIncrement: true
},
type:       DataTypes.STRING
});
Run Code Online (Sandbox Code Playgroud)

要删除该项目:

        models.Item.findOne({where: {id : params.itemID}}).then(function (video){           
        models.User.findOne({where: {id : params.itemID}}).then(function (user){            
            if(params.applaud == "true") {
                console.log("Add applaud");
                user.addItem(video,{type:"commend"});
            } else {
                user.removeItem(item,{where: {type:"commend"}});
                console.log("Remove, Commendation");
            }
            res.json({'response' : 'Success'});
    });     
});
Run Code Online (Sandbox Code Playgroud)

问题是,当我希望它只删除赞扬时,这将删除项目和用户之间的所有交互。

如何最好地管理 Sequelize 中相同两个表之间的多个多对多关系?

Ash*_*thi 5

好吧,我想通了。

在关联上,您必须通过“as”指定别名

User.belongsToMany(models.Item, {through: 'votes', as: 'votes'});
User.belongsToMany(models.Item, {through: 'commend', as: 'commend'});
Run Code Online (Sandbox Code Playgroud)

然后您可以添加查询:

    models.Item.findOne({where: {id: item.id}, 
        include: [{
            model: models.User,
            as: 'votes'
        }]
    })
Run Code Online (Sandbox Code Playgroud)

您可以添加:

user.addVote(item);
Run Code Online (Sandbox Code Playgroud)

或者

user.addCommend(item);
Run Code Online (Sandbox Code Playgroud)

并删除:

user.removeVote(item);
Run Code Online (Sandbox Code Playgroud)

或者

user.removeCommend(item)
Run Code Online (Sandbox Code Playgroud)

它按预期工作。