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
相关产品推荐
相关产品推荐

