如何通过Sequelize插入Audit记录时根据Action名称获取外键ID
问题描述
我拥有audits表和actions表,audits表引用actions表的id作为外键。
actions表结构及数据
| id | name |
|---|---|
| 1 | LOCK |
| 2 | UNLOCK |
我希望编写Sequelize插入语句,在提供action名称的情况下获取对应的id存入audits表,实现类似以下SQL的功能:
insert into audits (account, audit_action_id) select 'abc123', (select id from actions where name = 'LOCK')
期望插入后的audits表数据示例
| id | account | audit_action_id |
|---|---|---|
| 1 | abc123 | 1 |
| 2 | abc123 | 2 |
我的Audit模型包含auditActionId字段,但需要通过名称字符串查询得到该值,当前代码如下:
audit.save({ account: 'abc123', auditActionId: '???', });
请问该如何实现?
解决方案
这里提供三种可行的实现方式:
方式一:先查询Action再插入Audit
先根据action名称查询对应id,再传入Audit的保存方法:
// 假设Action是actions表对应的Sequelize模型 const action = await Action.findOne({ where: { name: 'LOCK' }, attributes: ['id'] }); if (action) { await Audit.create({ account: 'abc123', auditActionId: action.id }); }
方式二:使用Sequelize子查询直接插入
直接用子查询一步完成,和你给出的原生SQL逻辑一致:
const actionSubquery = Action.findOne({ where: { name: 'LOCK' }, attributes: ['id'], raw: true }); await Audit.create({ account: 'abc123', auditActionId: actionSubquery });
Sequelize会自动将这段代码转换为类似目标SQL的子查询插入语句。
方式三:利用模型关联简化操作
如果已经在Audit和Action模型中定义了关联(比如Audit.belongsTo(Action, { foreignKey: 'auditActionId' })),可以直接通过关联对象创建Audit:
const action = await Action.findOne({ where: { name: 'LOCK' } }); if (action) { await action.createAudit({ account: 'abc123' }); }
这种方式无需手动处理外键,Sequelize会自动填充auditActionId字段。
内容的提问来源于stack exchange,提问作者LazioTibijczyk
相关产品推荐
相关产品推荐

