Sequelize向关联添加属性

时间:2016-04-08 20:41:08

标签: node.js sequelize.js

我的投资组合有很多横幅。

我最初使用portfolio.setBanners([1,2,3])设置横幅,没问题。现在我想为每个横幅添加一个sortOrder整数。

我在这里设置关联:

Portfolio.belongsToMany(models.Version, { through: models.PortfolioBanner, foreignKey: 'portfolioId', otherKey: 'versionId', as: 'banners' });

Version.belongsToMany(models.Portfolio, { through: models.PortfolioBanner, foreignKey: 'versionId', otherKey: 'portfolioId', as: 'portfolios' });

这是我的PortfolioBanner模型:

const PortfolioBanners = sequelize.define('PortfolioBanner', {
    sortOrder: {
        type: DataTypes.INTEGER,
        defaultValue: 0
    }
});

我认为我不能使用setBanners,因为每个sortOrder值都不同。还有另一种方法叫做addAssociation,我认为我可以通过循环遍历横幅并单独设置每个方法来使用。

这是我最近的尝试,但它没有奏效。我将横幅设置为null,然后单独添加每个横幅。但似乎发生的是它部分有效。设置完毕后,有些横幅丢失了。

portfolio.setBanners(null);
banners.forEach(banner => {
    portfolio.addBanner(banner.id, {
        sortOrder: banner.sortOrder
    });
});

所以问题是我如何设置相关横幅的sortOrder?

以下是我参考的续集文档的链接。 http://docs.sequelizejs.com/en/latest/api/associations/belongs-to-many/

更新 使用上面的循环方法部分有效,但是我说我将横幅1添加为关联。然后我想添加横幅2.我将所有横幅设置为null然后循环横幅1和2添加addBanner,横幅1将不会保留,但横幅2将在那里。现在说我添加横幅3,横幅2将消失,但横幅1和3将保持不变。

1 个答案:

答案 0 :(得分:0)

forEach之后运行setBanners(null)似乎是竞争条件。 setBanners返回一个承诺。需要在setBanners结算后运行for循环。

result.setBanners(null).then(() => {
    banners.forEach(banner => {
        result.addBanner(banner.id, {
            sortOrder: banner.sortOrder
        });
    });
    cb(null, result);
});