如何在Sequelize中创建这种关系

时间:2016-01-19 13:45:01

标签: postgresql sequelize.js

我遇到以下关系的问题(请看下面的图片)。我不知道,如何在Sequelize中创建ArticleAbout :(我已经创建了产品,品牌和文章模型。我现在该怎么办?

relationship

1 个答案:

答案 0 :(得分:1)

取决于物品与品牌和产品的关系(我假设任何一篇文章可以指代多个产品和/或多个品牌)。 实现这一目标的最佳方法是建立从文章到产品和品牌的n:m关系。文档在这里更详细地解释了这一点: Sequelize Docs - Association#Scopes

所以,例如:

Article = sequelize.define('article', {
    title: DataTypes.String,
    text: DataTypes.TEXT
});

ArticleAbout = sequelize.define('article_about', {
    about_id: {
        type: DataTypes.INTEGER,
        unique: 'about_article_ref'
    },
    about: {
        type: DataTypes.STRING,
        unique: 'about_article_ref',
    },
    reference_id: {
        type: DataTypes.INTEGER,
        unique: 'about_article_ref',
        references: null
    }
});

Brand.belongsToMany(Article, {
    through: {
        model: ArticleAbout,
        unique: false.
        scope: {
            about: 'brand'
        }
    },
    foreignKey: 'reference_id',
    constraints: false
});

Product.belongsToMany(Article, {
    through: {
        model: ArticleAbout,
        unique: false.
        scope: {
            about: 'product'
        }
    },
    foreignKey: 'reference_id',
    constraints: false
});

Article.belongsToMany(Brand, {
    through: {
        model: ArticleAbout,
        unique: false
    },
    foreignKey: 'about_id'
});

Article.belongsToMany(Product, {
    through: {
        model: ArticleAbout,
        unique: false
    },
    foreignKey: 'about_id'
});

关键部分为unique: 'string'through:

通过设置字符串的唯一性,您可以告诉Sequelize将该键组合为复合键的一部分,这意味着可以将多个对象与一个键相关联。 constraints: false指示编译器停止对所有交叉引用外键尖叫。

设置through:通过表格设置关系,就像您在正在使用的AboutArticle表中所描述的那样。

然后,您可以开始向产品和品牌添加文章:

product.addArticle(article);
brand.addArticle(article);

在哪个方面,查询表变得非常简单:

Article.getProducts();
Article.getBrands();
Product.getArticles();
Brand.getArticles();

希望有所帮助。