繁体   English   中英

如何通过关联查询续集模型,但包含所有关联对象?

[英]How to query sequelize model by association, but include all associated objects?

尝试通过所有关联的属性进行查询,但获取所有关联

# FAQs: { id: 1, name: 'How to do it?' }, { id: 2, name: 'How to FIX it?' }
# tags: { id: 1, slug: 'api' }, { id: 2, slug: 'beta' }
# taggings: { id: 1, faqId: 1, mainEntityId: 1, mainEntityType: 'faq' }, { id: 2, faqId: 1, mainEntityId: 2, mainEntityType: 'faq' }

const query = { slugs: ['api'] }
const foundFAQs = await this.models.FAQ.findAll({
  where: {
    '$taggings.tag.slug$': { $in: query.slugs },
  },
  include: [{
    model: this.models.Tagging,
    as: "taggings",           
    include: [{
      model: this.models.Tag,         
      as: 'tag',
    }],        
  }],
})

我的模型定义:

models.Tagging.belongsTo(models.Tag, { as: 'tag', onDelete: 'cascade' });
models.Tag.hasMany(models.Tagging, { as: 'taggings', onDelete: 'cascade' });
models.Tag.belongsToMany(models.FAQ, { through: models.Tagging, as: 'faqs' });
models.FAQ.hasMany(models.Tagging, { as: 'taggings', onDelete: 'cascade' });
models.FAQ.belongsToMany(models.Tag, { through: models.Tagging, as: 'tags' });

你期望发生什么?

我想获得所有与 TAG api相关联的常见问题解答并拥有其所有标签。

对象:{ id: 1, name: 'How to do it?', tags: [ { id: 1, slug: 'api' }, { id: 2, slug: 'beta' } ] }

实际发生了什么?

查询返回对象:{ id: 1, name: 'How to do it?', tags: [ { id: 1, slug: 'api' } ] }

输出

SELECT \"faq\".\"id\", \"faq\".\"name\", \"faq\".\"bankId\", \"faq\".\"priority\", 
\"faq\".\"publishedLocales\", \"faq\".\"createdAt\", \"faq\".\"updatedAt\", \"taggings\".\"id\" 
AS \"taggings.id\", \"taggings\".\"tagId\" AS \"taggings.tagId\", \"taggings\".\"locked\" 
AS \"taggings.locked\", \"taggings\".\"sdkId\" AS \"taggings.sdkId\", \"taggings\".\"guideId\" 
AS \"taggings.guideId\", \"taggings\".\"newsId\" AS \"taggings.newsId\", \"taggings\".\"faqId\" 
AS \"taggings.faqId\", \"taggings\".\"apiId\" AS \"taggings.apiId\", \"taggings\".\"createdAt\" 
AS \"taggings.createdAt\", \"taggings\".\"updatedAt\" AS \"taggings.updatedAt\", \"taggings->tag\".\"id\" 
AS \"taggings.tag.id\", \"taggings->tag\".\"name\" AS \"taggings.tag.name\", \"taggings->tag\".\"slug\" 
AS \"taggings.tag.slug\", \"taggings->tag\".\"tagType\" AS \"taggings.tag.tagType\", \"taggings->tag\".\"mainEntityId\" 
AS \"taggings.tag.mainEntityId\", \"taggings->tag\".\"createdAt\" 
AS \"taggings.tag.createdAt\", \"taggings->tag\".\"updatedAt\" 
AS \"taggings.tag.updatedAt\" FROM \"faqs\" AS \"faq\" INNER JOIN \"taggings\" 
AS \"taggings\" ON \"faq\".\"id\" = \"taggings\".\"faqId\" LEFT OUTER JOIN \"tags\" 
AS \"taggings->tag\" ON \"taggings\".\"tagId\" = \"taggings->tag\".\"id\" WHERE \"faq\".\"bankId\" = 'bank.csas' 
AND \"taggings->tag\".\"slug\" IN ('faq') ORDER BY \"faq\".\"priority\" DESC;

方言: postgres

方言版本: pg@^6.1.0

数据库版本: PostgreSQL 10.1

续集版本: 4.23.2

用最新版本测试:否 (4.23.2)

节点: 8.6.0

我不确定这是一个错误还是我做错了什么。

谢谢

您希望包含每条记录的所有相关数据,但根据相关数据过滤这些记录。 您将希望让 Sequelize 生成类似于以下内容的 SQL:

SELECT "faq"."id", ....
FROM "faqs" AS "faq"
INNER JOIN "taggings" AS "taggings" ON "faq"."id" = "taggings"."faqId"
LEFT OUTER JOIN "tags" AS "taggings->tag" ON "taggings"."tagId" = "taggings->tag"."id"
LEFT OUTER JOIN "tags" AS "taggings->tagdata" ON "taggings"."tagId" = "taggings->tagdata"."id"
WHERE "faq"."bankId" = 'bank.csas' AND "taggings->tag"."slug" IN ('faq')
ORDER BY "faq"."priority" DESC;

像这样的事情可能会奏效:

const foundFAQs = await this.models.FAQ.findAll({
  where: {
    '$taggings.tag.slug$': { $in: query.slugs },
  },
  include: [{
    model: this.models.Tagging,
    as: "taggings",           
    include: [{
      model: this.models.Tag,         
      as: 'tag',
    },{
      model: this.models.Tag,         
      as: 'tagdata',
    }],
  }],
})

这里的想法是您正在执行要过滤的连接,然后执行另一个连接以获取过滤行的额外记录。

这对我今天有用 - 嵌套includes

getReferralPlanForThisCode(parent, args, context) {
    let {referralCode} = args;
    return Promise.resolve()
        .then(() => {
            let referralPlan = connectors.ReferralPlans.findAll({
                include: [{
                    model: connectors.ReferralCodes,
                    where: {unique_referral_code: referralCode},
                    include: [{
                        model: connectors.epUserData, as: 'referrer',
                    }],
                }],
            })
            return referralPlan;
        })
        .then(referralPlan => {
            return referralPlan;
        })
        .catch((err) => {
            console.log(err);
        });
}

暂无
暂无

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

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