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

如何在Sequelize关联属性中展平中间表字段?

如何在Sequelize中将belongsToMany中间表字段展平到关联模型对象中

方案1:查询阶段直接映射字段(推荐)

通过Sequelize的字段引用功能,在关联模型的属性列表中直接包含中间表字段,同时关闭中间表对象的返回:

首先引入Sequelize的col工具:

const { Sequelize, col } = require('sequelize');

修改查询语句:

const stage = await Stages.findByPk(stageId, {
    include: [
        {
            association: 'users',
            attributes: [
                'id',
                'userName',
                'userPhoto',
                // 直接引用中间表字段并设置别名
                [col('StageUsers.userRemainingBudget'), 'userRemainingBudget']
            ],
            through: { attributes: [] }, // 不返回嵌套的StageUsers对象
        },
    ],
    raw: true, // 启用原始查询模式,让字段直接关联到用户对象
    nest: true // 保持关联模型的嵌套结构,避免字段扁平化到根层级
});

执行后返回的stage结构将完全符合期望,中间表的userRemainingBudget会直接出现在每个users数组的对象中。

方案2:查询后手动处理结果

如果不想启用raw模式,可以在查询完成后手动遍历数据,将中间表字段移到用户对象中:

const stage = await Stages.findByPk(stageId, {
    include: [
        {
            association: 'users',
            attributes: ['id', 'userName', 'userPhoto'],
            through: { attributes: ['userRemainingBudget'] },
        },
    ],
});

// 转换为普通对象并处理用户数组
const stageData = stage.toJSON();
stageData.users = stageData.users.map(user => {
    // 解构出中间表数据和用户基础数据
    const { StageUsers, ...userInfo } = user;
    return {
        ...userInfo,
        userRemainingBudget: StageUsers.userRemainingBudget
    };
});

return stageData;

这种方法的优势是保留Sequelize模型实例的特性(如果后续需要使用模型方法),适合需要额外数据处理的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:50:30