Sequelize原生查询中能否获取VIRTUAL字段的值?
能否在Sequelize原生查询中包含VIRTUAL字段?
不行,原生查询默认不会自动包含模型定义的VIRTUAL字段——因为这类字段是Sequelize在内存层面基于已有字段计算出来的,并不存在于数据库表中,数据库本身不知道这个字段的存在。
不过有两种可行的解决办法,适配不同场景:
1. 在原生SQL中手动计算对应字段
直接在SELECT语句里写出和VIRTUAL字段逻辑一致的计算表达式,给结果起相同的别名。比如针对你的User模型:
let queryText = '\ SELECT \ user.firstName AS firstName, \ user.lastName AS lastName, \ CONCAT(user.firstName, \' \', user.lastName) AS presentation \ FROM \ user as user' const items = await sequelize.query(queryText, { type: QueryTypes.SELECT })
这种方式的好处是计算逻辑在数据库层面完成,如果你需要对这个字段做排序、过滤等操作,会更高效。
2. 将查询结果转换为模型实例
把原生查询返回的普通对象,通过模型的build方法转换成Sequelize实例,这样Sequelize会自动触发VIRTUAL字段的getter逻辑,生成对应的字段值:
const items = await sequelize.query(queryText, { type: QueryTypes.SELECT }); // 转换为User模型实例,isNewRecord设为false表示这是已有数据 const userInstances = items.map(item => User.build(item, { isNewRecord: false })); // 现在访问userInstances[0].presentation就能得到计算后的值
这种方式更适合你提到的多表关联、多VIRTUAL字段的场景——不用在SQL里重复写大量计算逻辑,直接复用模型中定义好的getter,维护成本更低。如果关联表也有VIRTUAL字段,只需要把对应表的查询结果转换成对应模型的实例即可。
内容的提问来源于stack exchange,提问作者barkas
相关产品推荐
相关产品推荐

