Ent ORM中关联记录的updated_at字段同步更新方案咨询
解决Ent ORM中关联添加密码时
password.updated_at不更新的问题 问题根源
Ent的user.Update().AddPasswords()操作本质是更新password表的用户外键关联,属于EdgeUpdate操作范畴,而非password表的标准Update操作。你之前仅给updateOp绑定了钩子,所以这个关联操作不会触发钩子,也不会触发updated_at的自动更新逻辑。
简洁解决方案
1. 扩展钩子的触发范围到EdgeUpdate
修改password schema的钩子定义,把ent.OpEdgeUpdate加入触发条件,让关联更新操作也能触发钩子更新updated_at:
func (Password) Hooks() []ent.Hook { return []ent.Hook{ hook.On( func(next ent.Mutator) ent.Mutator { return hook.PasswordFunc(func(ctx context.Context, m *ent.PasswordMutation) (ent.Value, error) { // 手动设置updated_at为当前时间 m.SetUpdatedAt(time.Now()) return next.Mutate(ctx, m) }) }, ent.OpUpdate | ent.OpEdgeUpdate, // 同时监听Update和EdgeUpdate操作 ), } }
如果你的password表已经用field.Time("updated_at").UpdateDefault(time.Now())设置了自动更新,只需确保逻辑能捕获OpEdgeUpdate即可——部分Ent版本的自动更新默认仅响应OpUpdate,需要通过钩子补全。
2. 批量更新关联密码(可选)
如果需要更灵活的控制,可以在用户更新逻辑中批量更新关联密码的外键和updated_at,适合复杂场景:
// 在更新用户关联关系的同时,批量更新密码的updated_at client.Password.Update(). Where(password.IDIn(fetchedPassword.ID)). SetUser(user). SetUpdatedAt(time.Now()). ExecX(ctx)
不过这种方式不如钩子方案简洁,推荐优先使用第一种钩子扩展方式。
验证
修改完钩子后,重新执行user.Update().AddPasswords(fetchedPassword).SaveX(ctx),此时password表的updated_at字段会被钩子自动更新,无需单独执行密码的更新操作。
内容的提问来源于stack exchange,提问作者Serban Marin-Eusebiu
相关产品推荐
相关产品推荐

