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

如何在Sequelize的include操作中将关联字段平级到主对象

解决方案

方法1:通过Sequelize查询配置直接生成扁平化结果

直接在findAndCountAll的attributes中指定关联表的字段,用Sequelize.col映射到主对象的平级属性,同时隐藏关联模型的原始字段:

const { Sequelize } = require('sequelize');
const result = await SelectedEmployees.findAndCountAll({
  attributes: [
    // 保留SelectedEmployees自身需要的字段
    'id',
    'selectedDate',
    // 映射User表的字段到平级属性
    [Sequelize.col('user.id'), 'userId'],
    [Sequelize.col('user.name'), 'userName'],
    [Sequelize.col('user.email'), 'userEmail']
  ],
  include: [{
    model: User,
    attributes: [], // 不返回User的嵌套对象
    required: true // 按需设置是否为内连接,false则为左连接
  }],
  raw: true // 启用raw模式,直接返回普通对象
});

这种方式查询后,result.rows里的每个对象都会直接包含userId、userName、userEmail这些平级字段,无需额外处理。

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

如果需要保留Sequelize模型实例的方法(比如后续调用save()),可以先正常查询,再遍历结果手动扁平化:

const { count, rows } = await SelectedEmployees.findAndCountAll({
  include: [{
    model: User,
    attributes: ['id', 'name', 'email'] // 只查询需要的User字段
  }]
});

// 遍历处理每一条数据
const flattenedRows = rows.map(item => {
  // 先转成普通JSON对象,避免模型实例的干扰
  const plainItem = item.toJSON();
  // 解构出user和剩余字段,再合并平级属性
  const { user, ...rest } = plainItem;
  return {
    ...rest,
    userId: user.id,
    userName: user.name,
    userEmail: user.email
  };
});

// 返回处理后的结果
return { count, rows: flattenedRows };

为什么raw: true和nest: true达不到需求?

默认情况下,raw: true会将关联字段以user.id、user.name的形式返回(不带nest: true),或者返回嵌套的user对象(带nest: true),但不会自动将关联字段平级到主对象中。上面两种方法分别从查询配置和结果处理两个层面解决了这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:39:53