Sequelize内连接查询如何将关联表字段平级返回而非嵌套
问题:Sequelize内连接查询如何将关联表字段与主表字段平级返回
我是Sequelize新手,目前在做内连接查询,需要从主表和关联表中选择指定字段。现有查询代码如下:
const paramPostgres: QueryBuilder = { raw: false, nest: true, include: [{ model: UserAccountDeRepository.getInstance().model, as: "userAccountTableAlias", attributes: ["account"], required: true }], attributes: ["is_archived", "status", "udiId"], where: { '$userAccountTableAlias.user$': usernames } }
当前返回结果中,关联表的account字段嵌套在userAccountTableAlias别名对象下:
[{"is_archived":false,"status":"COMPLETED","udiId":"9e8350f1-fab0-4861-96ae-1268118c49a3","userAccountTableAlias":{"account":"133b5f93-916b-46c1-b429-6c071c752097"}}]
我期望将account字段与主表字段平级返回,格式如下:
[{"is_archived":false,"status":"COMPLETED","udiId":"9e8350f1-fab0-4861-96ae-1268118c49a3","account":"133b5f93-916b-46c1-b429-6c071c752097"}]
请问如何实现该需求?
解决方案
有两种常用方法可以实现关联表字段与主表字段平级返回:
方法一:在主表attributes中直接指定关联表字段(推荐)
修改attributes配置,用数组形式包含主表字段和关联表的account字段,同时给关联表字段起别名,就能让它和主表字段平级。注意要把关联表的attributes设为空数组,避免返回嵌套对象:
const paramPostgres: QueryBuilder = { raw: false, nest: true, include: [{ model: UserAccountDeRepository.getInstance().model, as: "userAccountTableAlias", attributes: [], // 空数组避免返回嵌套对象 required: true }], attributes: [ "is_archived", "status", "udiId", // 指定关联表的account字段,并重命名为account [Sequelize.col('userAccountTableAlias.account'), 'account'] ], where: { '$userAccountTableAlias.user$': usernames } }
确保项目中已正确导入Sequelize对象或对应的实例。
方法二:开启raw: true并手动指定字段
开启raw: true后,Sequelize会返回原始查询结果,此时通过字段别名即可实现平级:
const paramPostgres: QueryBuilder = { raw: true, nest: false, // 关闭嵌套 include: [{ model: UserAccountDeRepository.getInstance().model, as: "userAccountTableAlias", attributes: [], required: true }], attributes: [ "is_archived", "status", "udiId", ['userAccountTableAlias.account', 'account'] ], where: { '$userAccountTableAlias.user$': usernames } }
这种方式返回的结果直接是平级结构,无需额外处理。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

