如何使用多对多表配置hasMany关系

时间:2016-02-06 22:59:41

标签: node.js sequelize.js

我有以下设置:

Organization (1)----(*) OrganizationArticleItemMap (*)----(1) ArticleItem
                                   (1)
                                    |
                                    |
                                    |
                                   (*)
                          ArticleItemPriceRule          

因此,文章项可以属于许多组织,组织可以有许多文章项。对于组织中的每个商品,都会有多个价格规则。

多对多的关系已经配置如下:

this.models.ArticleItem.belongsToMany(this.models.Organization, {
    through: this.models.OrganizationArticleItemMap,
    foreignKey: 'ArticleItemId'
    });
this.models.Organization.belongsToMany(this.models.ArticleItem, {
    through: this.models.OrganizationArticleItemMap,
    foreignKey: 'OrganizationId'
    });

我真的不知道应该如何配置ArticleItemPriceRule,以便我可以获取给定组织的所有文章的Price规则。

我尝试了以下内容:

this.models.ArticleItem.hasMany(this.models.OrganizationArticleItemMap, {
    foreignKey: 'ArticleItemId',
    as: 'OrganizationMaps'
});
this.models.OrganizationArticleItemMap.hasMany(this.models.ArticleItemPriceRule, {
    as: 'Prices',
    foreignKey: 'Organizations_articleitem_map_Id'
});

然后是以下查询:

DataAccess.dataContext.models.ArticleItem.findAll({
                include: [
                    {
                        model: DataAccess.dataContext.models.Organization,
                        where: {OrganizationId: '1'},
                        attributes: [],
                        through: {
                            attributes: []
                        }
                    },
                    {
                        model: DataAccess.dataContext.models.OrganizationArticleItemMap,
                        as: 'OrganizationMaps',
                        required: true,
                        include: [{
                            model: DataAccess.dataContext.models.ArticleItemPriceRule,
                            as: 'Prices',
                            required: false
                        }]

                    }
                ],
                where: {ArticleItemId: '1'}
            })

这个问题是生成的sql查询包含两次与OrganizationArticleItemMap的内部联接。

SELECT `ArticleItem`.`ArticleItemId`,
       `ArticleItem`.`ArticleCategoryId`,
       `ArticleItem`.`VisibleOnOnlineBooking`,
       `OrganizationMaps`.`Organization_articleitem_map_Id` AS `OrganizationMaps.OrganizationArticleItemMapId`,
       `OrganizationMaps`.`OrganizationId` AS `OrganizationMaps.OrganizationId`,
       `OrganizationMaps`.`ArticleItemId` AS `OrganizationMaps.ArticleItemId`,
       `OrganizationMaps.Prices`.`ArticleItemPriceRuleId` AS `OrganizationMaps.Prices.ArticleItemPriceRuleId`,
       `OrganizationMaps.Prices`.`Organizations_articleitem_map_Id` AS `OrganizationMaps.Prices.Organizations_articleitem_map_Id`,
       `OrganizationMaps.Prices`.`CurrencyId` AS `OrganizationMaps.Prices.CurrencyId`,
       `OrganizationMaps.Prices`.`Price` AS `OrganizationMaps.Prices.Price`,
       `OrganizationMaps.Prices`.`ValidFrom` AS `OrganizationMaps.Prices.ValidFrom`
FROM `articleitem` AS `ArticleItem`
INNER JOIN (`organization_articleitem_map` AS `Organizations.OrganizationArticleItemMap`
            INNER JOIN `organizations` AS `Organizations` ON `Organizations`.`OrganizationId` = `Organizations.OrganizationArticleItemMap`.`OrganizationId`) ON `ArticleItem`.`ArticleItemId` = `Organizations.OrganizationArticleItemMap`.`ArticleItemId`
AND `Organizations`.`OrganizationId` = '1'
AND `Organizations`.`IsDeleted` = 0
INNER JOIN `organization_articleitem_map` AS `OrganizationMaps` ON `ArticleItem`.`ArticleItemId` = `OrganizationMaps`.`ArticleItemId`
LEFT OUTER JOIN `articleitempricerule` AS `OrganizationMaps.Prices` ON `OrganizationMaps`.`Organization_articleitem_map_Id` = `OrganizationMaps.Prices`.`Organizations_articleitem_map_Id`
AND `OrganizationMaps.Prices`.`IsDeleted` = 0
WHERE `ArticleItem`.`ArticleItemId` = '1'
  AND `ArticleItem`.`IsDeleted` = 0;

1 个答案:

答案 0 :(得分:0)

嗯,这是我从github上的sequelize团队得到的回复:

  

Sequelize并不知道这两个关系使用相同的表。   你看起来正确地做到了,我们只是不够聪明   推断我们可以只使用连接表一次。

https://github.com/sequelize/sequelize/issues/5376