Sequelize关联查询时如何将返回的对象数组转换为纯字符串数组
解决方案
Sequelize 本身没有内置配置可以直接将关联查询的单字段返回为纯数组,关联查询默认会返回关联模型的对象结构,你可以通过以下两种方式实现需求:
方案1:查询后做数据转换(最通用,推荐)
这种方式不依赖数据库类型,兼容所有 Sequelize 版本,逻辑简单易维护:
const dbDataTest = await Recipe.findAll({ include: [ { model: Diet, attributes: ['name'], // 直接指定查询字段比exclude写法更简洁 through: {attributes: []} }, ], }); // 转换为目标格式 const formattedResult = dbDataTest.map(recipe => { const plainRecipe = recipe.toJSON(); // 提取diet的name字段组成纯数组 plainRecipe.diets = plainRecipe.diets.map(diet => diet.name); return plainRecipe; })
方案2:使用数据库聚合函数在查询层处理
如果你希望减少内存转换的逻辑,可以结合对应数据库的聚合函数实现:
MySQL 环境示例:
const { sequelize } = require('./你的sequelize实例文件路径'); const dbDataTest = await Recipe.findAll({ attributes: [ 'id', 'name', // 此处列出所有你需要返回的Recipe表字段 [sequelize.fn('GROUP_CONCAT', sequelize.col('diets.name')), 'diets'] ], include: [ { model: Diet, attributes: [], // 关联模型不返回额外字段 through: {attributes: []} } ], group: ['Recipe.id'], // 按主表ID分组 raw: true // 直接返回纯JSON对象,不封装Sequelize实例 }); // 把逗号拼接的diet字符串转为数组 const formattedResult = dbDataTest.map(recipe => ({ ...recipe, diets: recipe.diets ? recipe.diets.split(',') : [] }))
PostgreSQL 环境示例:
把上述代码中的GROUP_CONCAT替换为STRING_AGG即可,其余逻辑一致。
内容的提问来源于stack exchange,提问作者swirlm
相关产品推荐
相关产品推荐

