You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 09:15:11