如何在Sequelize.literal中引用模型而非数据库表?
在Sequelize.literal中引用模型而非数据库表的方法
当然可以,不用硬编码数据库表名,直接通过模型的tableName属性就能动态获取表名,这样代码更贴合Sequelize的模型化写法,也避免了硬写表名带来的维护问题。
修改后的代码示例
const result = await OModel.findAll({ where: { requestId: requestId }, include: { model: RModel, attributes: [ 'amount' ] }, attributes: [ 'id', 'interest', [ // 通过模型的tableName属性动态获取表名 Sequelize.literal(`\`${RModel.tableName}\`.\`amount\` * \`${OModel.tableName}\`.\`interest\``), 'amountXInterest' ] ] });
关键说明
- 每个Sequelize模型都自带
tableName属性,默认会根据模型名生成对应表名(比如OModel默认对应omodels,如果手动设置了tableName: 'otable'则返回自定义值)。 - 如果在
include中给模型设置了别名(比如as: 'record'),那在literal里需要使用别名代替表名,比如\record`.`amount``,这种场景下也可以结合关联配置统一管理。 - 也可以用字符串拼接替代模板字符串,避免转义反引号:
Sequelize.literal('`' + RModel.tableName + '`.`amount` * `' + OModel.tableName + '`.`interest`')
内容的提问来源于stack exchange,提问作者codebear22
相关产品推荐
相关产品推荐

