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

如何在Node.js的Sequelize关联查询中获取扁平单对象结果

如何将Sequelize关联查询的嵌套地址字段平级输出?

嘿,我来帮你搞定这个问题!你现在需要把Sequelize关联查询返回的嵌套在addresses数组里的地址字段,平级放到用户对象的顶层,有两种实用的方法可以实现:

方法一:修改查询配置,直接返回平级结果

这种方法让Sequelize在查询阶段就返回你想要的平级结构,不需要额外处理数据:

// 记得先引入Sequelize哦
const Sequelize = require('sequelize');

myDb.user.findAll({
  attributes: [
    'ID',
    'NAME',
    // 指定关联表的字段,并设置别名匹配预期输出
    [Sequelize.col('addresses.ADDRESS_1'), 'ADDRESS_1'],
    [Sequelize.col('addresses.ADDRESS_2'), 'ADDRESS_2'],
    [Sequelize.col('addresses.CITY'), 'CITY'],
    [Sequelize.col('addresses.STATE'), 'STATE'],
    [Sequelize.col('addresses.POSTCODE'), 'POSTCODE']
  ],
  include: [{
    model: myDb.addresses,
    as: 'addresses',
    attributes: [], // 这里留空,避免重复返回嵌套的addresses结构
    required: true // 如果是一对一关联,确保只返回有地址的用户(可选)
  }],
  raw: true // 开启raw模式,返回原始的平级数据对象
}).then((getCustomer) => {
  // 现在输出的结构就是你预期的平级格式啦
  console.log(getCustomer);
});

原理说明:通过Sequelize.col()明确指定关联表的字段,结合raw: true让Sequelize跳过模型实例的构建,直接返回数据库查询的平级结果,完美匹配你的预期输出。

方法二:在查询后手动处理数据结构

如果不想修改查询配置,可以在拿到结果后用JavaScript的数组方法调整结构:

myDb.user.findAll({
  attributes: ['ID','NAME'],
  include: [{
    model: myDb.addresses,
    as: 'addresses',
    attributes:['ADDRESS_1','ADDRESS_2','CITY','STATE','POSTCODE'],
  }]
}).then((getCustomer) => {
  // 将模型实例转为普通对象,并合并地址字段
  const formattedResult = getCustomer.map(item => {
    const { addresses, ...userInfo } = item.toJSON();
    // 因为你的addresses是数组,取第一个元素合并到用户对象中
    return { ...userInfo, ...addresses[0] };
  });
  console.log(formattedResult);
});

注意事项:如果你的user和addresses是一对多关联,addresses数组可能有多个元素,这时候你需要根据业务需求选择取第一个地址,或者做其他处理(比如拼接多个地址)。从你的预期输出来看,应该是一对一关联,所以addresses[0]完全适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:02:58