简体   繁体   English

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

[英]How to configure hasMany relationship with many-to-many table

I have the following setup: 我有以下设置:

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

An article item can thus belong to many organizations and an organization can have many article items. 因此,商品可以属于许多组织,而一个组织可以具有许多商品。 For every article item in an organization there will be multiple price rules. 对于组织中的每个商品,都有多个价格规则。

The many to many relationship has been configured as such: 多对多关系已配置为:

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'
    });

I do not really know how I should configure ArticleItemPriceRule so that I can fetch the Price rules for all articles for a given organization. 我真的不知道如何配置ArticleItemPriceRule,以便可以获取给定组织的所有文章的价格规则。

I have tried the following : 我尝试了以下方法:

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'
});

and then the following query: 然后执行以下查询:

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'}
            })

The problem with this is that the sql query that was generated included an inner join with OrganizationArticleItemMap twice. 这样做的问题是,生成的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;

Well, this is the response I got from the sequelize team on github: 好吧,这是我从github上的续集团队得到的回应:

Sequelize doesn't know that those two relations uses the same tables. Sequelize不知道这两个关系使用相同的表。 You look to be doing it correctly, we just aren't smart enough to infer that we could use the join table just a single time. 您看起来做得正确,我们只是不够聪明,无法推断我们只能使用一次联接表。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM