我正在使用Sequelize for Node,我有用户和项目。用户可以以多种方式与项目交互,例如投票或表扬(在这种情况下为两种不同的事物)。
我最初的想法是有两个不同的多对多关系,但Sequelize只有一个removeItem调用,我还没弄明白如何指定哪个。
计划2是用一个额外的元素构建一个多对多的表"类型"所以我可以指明那种。我可以在添加东西时指定类型。这遇到了两个问题,一个是forign键,默认情况下是唯一的。我通过从DB手动删除约束来纠正这个问题,这似乎已经足够了(我将id设置为主键自动增量)。其次,我似乎无法弄清楚如何使删除指定type =我想要的类型。
代码:
构建表格:
var UserActions = sequelize.define('userActions', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
type: DataTypes.STRING
});
删除项目:
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'});
});
});
问题是这会删除项目与用户之间的所有互动,当我希望它只删除表扬时。
如何在Sequelize中最好地管理同一两个表之间的多对多关系?
答案 0 :(得分:0)
好的我明白了。
在关联中,您必须通过'指定别名作为'
User.belongsToMany(models.Item, {through: 'votes', as: 'votes'});
User.belongsToMany(models.Item, {through: 'commend', as: 'commend'});
然后您可以添加查询:
models.Item.findOne({where: {id: item.id},
include: [{
model: models.User,
as: 'votes'
}]
})
您可以添加:
user.addVote(item);
或
user.addCommend(item);
并删除:
user.removeVote(item);
或
user.removeCommend(item)
它可以按预期工作。