如何在sequelize中更新through-NM-attribute?

时间:2016-11-01 09:03:59

标签: mysql node.js sequelize.js mariadb

我已经阅读了this个问题并且没有帮助我,所以我问自己的问题:

假设我使用Sequelize和MariaDB通过表连接了2个表:

User <-- UserItem --> Item

单个用户可以拥有多个项目,单个项目可以属于许多用户。但我需要一个自定义直通属性来存储项目的数量,我们称之为苹果。因此,根据docs,这将是定义:

var UserItem = Sequelize.define('UserItem', {
  quantity: DataTypes.INTEGER
}, 
  timestamps: false
});
models.Item.belongsToMany(models.User, {through: 'UserItem'});
models.User.belongsToMany(models.Item, {through: 'UserItem'});

然后我添加了一个与之相关的新关系:

User.addItem(item, { quantity: 0 });

这可以按预期工作。但是,如果我需要更新物品的数量怎么办?我可以做到以下几点:

User.addItem(item, { quantity: 20 });

如果存在,我的物品的数量将更新为20,否则将插入。我不想要这个。我想要这样的东西:

User.addItem(item, { quantity: quantity + 1 });

但是由于无法对连接表进行查询,我无法使用以前的值获取特定的NM行进行更新。

我怎样才能做到这一点?提前谢谢。

1 个答案:

答案 0 :(得分:0)

您仍然拥有docs

中指定的联接表DAO

在这种情况下,您需要知道item是否是新关联。

所以它看起来像。

User.hasItem( item )
    .then( exists => {

       if ( !exists ) { 
            return User.addItem( item, { quantity : 20 } ) 
       } else {
            item.UserItem.quantity += 1;
            return item.UserItem.save();
       }

    } )

您还可以阅读有关hasAssociation in the docs的更多信息。