序列化多对多关系如何将查询应用于“子项”并返回所有子行

问题描述 投票:0回答:1

我很难让我的查询从使用 Sequelize 的查询中返回所有“子项”。

我有两个型号

Offer
Tag
。这些模型通过连接表
offer_tags
(模型
OfferTags
)具有多对多关系,并且具有列
id
offer_id
tag_id
。我使用sequelize为我创建模式,但仅作为ORM工具,因此我创建了表的模型并创建了多对多关系,例如:

Offer.belongsToMany(Tag, { through: OfferTags });
Tag.belongsToMany(Offer, { through: OfferTags });

我正在尝试创建一个查询来获取报价,通过使用标签 ID 执行 IN 子句来获取仅包含特定标签的订单来过滤报价。我可以执行此操作,但是只要任何标签 id 与 IN 子句中的 id 匹配,我就想返回商品及其所有标签,但查询仅返回 IN 子句中匹配的标签,而不是全部其中。这是我当前的查询:

return await Offer.findAll({
  include: [
    Customer,
    {
      model: Tag,
      where: {
        id: {
          [Op.in]: [1, 2, 3, 4, 5]
        }
      },
      through: {
        attributes: []
      }
    }
  ]
});

客户包含只是报价和客户之间的另一种多对一关系(如果重要的话)。但是,此查询仅返回标签 id 为 IN

[1, 2, 3, 4, 5]
的标签,并且我试图让它返回报价及其标签的 ALL(如果任何标签包含在 IN 子句中)。我也正在使用 PostgreSQL 数据库。有什么建议吗?

javascript node.js typescript express sequelize.js
1个回答
0
投票

尝试下面修改后的 Sequelize 查询,我修改了检索具有至少一个指定标签的商品的方法,同时还包括这些商品的所有关联标签。我没有直接在

include
Tag
子句中应用过滤器(这会将返回的标签限制为仅与指定 ID 匹配的标签),而是将过滤条件移至外部查询级别。这是使用
'$Tags.id$'
子句中的特殊 Sequelize 语法
where
来完成的,该语法根据任何指定标签 ID 的存在来过滤报价。
include
Tag
子句保留,没有
where
条件。

return await Offer.findAll({
  include: [
    Customer,
    {
      model: Tag,
      through: {
        attributes: []
      }
    }
  ],
  where: {
    '$Tags.id$': {
      [Op.in]: [1, 2, 3, 4, 5]
    }
  },
  subQuery: false
});
© www.soinside.com 2019 - 2024. All rights reserved.