You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sequelize多对多查询返回多余products_carts数据问题求助

问题:Sequelize多对多关联查询返回中间表数据的原因及解决

我有Products和carts两张表,通过products_carts中间表建立多对多关联。查询指定Cart数据并关联Product时,期望只获取Cart和关联的Product数据,但返回结果里却附带了products_carts的内容。

查询代码

const a = await Cart.findByPk(1,{
  attributes: ['id'],
  include: {
    model: Product,
    attributes: ['id'],
  },
});

执行的SQL语句

Executing (default): SELECT `cart`.`id`, `products`.`id` AS `products.id`,
`products->products_carts`.`createdAt` AS `products.products_carts.createdAt`, 
`products->products_carts`.`updatedAt` AS `products.products_carts.updatedAt`, 
`products->products_carts`.`cartId` AS `products.products_carts.cartId`, `products->products_carts`.`productId` AS `products.products_carts.productId` FROM `carts` AS 
`cart` LEFT OUTER JOIN ( `products_carts` AS `products->products_carts` INNER JOIN 
`products` AS `products` ON `products`.`id` = `products->products_carts`.`productId`) ON 
`cart`.`id` = `products->products_carts`.`cartId` WHERE `cart`.`id` = 1;

返回结果

{
    "cart": {
        "id": 1,
        "products": [
            {
                "id": 1,
                "products_carts": { // 我不希望显示这个!!!
                    "createdAt": "2022-12-25T13:42:16.000Z",
                    "updatedAt": "2022-12-25T13:42:16.000Z",
                    "cartId": 1,
                    "productId": 1
                }
            }
        ]
    }
}

表关联定义(PC代表products_carts)

Cart.belongsToMany(Product, { through: PC });
Product.belongsToMany(Cart, { through: PC });
User.hasOne(Cart);
Cart.belongsTo(User);

疑问:为何会返回products_carts的数据?


解答

原因

Sequelize默认会在多对多关联查询中返回中间表的所有字段——因为中间表通常包含关联的元数据(比如默认的createdAt、updatedAt,或者自定义的关联属性),框架默认认为这些信息可能有用,所以自动包含进结果。

解决办法

要隐藏中间表数据,有两种可行方案:

方案1:全局关联定义时指定不返回中间表字段

修改关联配置,明确告诉Sequelize忽略中间表的所有字段:

Cart.belongsToMany(Product, { 
  through: {
    model: PC,
    attributes: [] // 空数组表示不返回任何中间表字段
  } 
});
Product.belongsToMany(Cart, { 
  through: {
    model: PC,
    attributes: []
  } 
});

方案2:单次查询中临时配置

如果不想改动全局关联,也可以在当前查询的include选项中添加through配置:

const a = await Cart.findByPk(1,{
  attributes: ['id'],
  include: {
    model: Product,
    attributes: ['id'],
    through: {
      attributes: [] // 仅本次查询不返回中间表数据
    }
  },
});

两种方式都能让Sequelize不再查询中间表的字段,返回结果里也就不会出现products_carts的内容了。


内容的提问来源于stack exchange,提问作者Mohammad ARZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 09:10:40