我有一个模型:

 type User struct {
      ID     uint
      Name   string
      Age    int
      Gender string
      // hundreds of fields
 }

使用此挂钩:

func (m *User) AfterFind(tx *gorm.DB) (err error) {
  // I don't know how to get Gender value of APIUser struct from here
  return
}

和这个聪明的 Select struct :

type APIUser struct {
  ID   uint
  Gender string
}

然后,我运行以下查询:

DB.Model(&User{}).Find(&APIUser{}, id)

在AfterFind()钩子中,我想在将从数据库检索到的数据发送到客户端之前对其进行操作,但我无法在该钩子中获得值.如何做到这一点呢?

推荐答案

AfterFind应同时设置为APIUserUser

以下是示例代码

type User struct {
    Id       uint64
    Avatar   string
    Nickname string
    Password string
}

func (user *User) AfterFind(*gorm.DB) error {
    return nil
}

type UserSimple struct {
    Id     uint64
    Avatar string
}

func (v *UserSimple) AfterFind(*gorm.DB) error {
    v.Avatar = "prefix/" + v.Avatar
    return nil
}

us := &UserSimple{}
db.Model(&User{}).Where("id = ?", 123).Find(us) 

输出

{123 prefix/avatar}

Go相关问答推荐

困扰围棋官方巡回赛的S建议所有方法都使用同一类型的接收器

Go:如何在不加载正文的情况下创建 http 代理通行证

在 GoLang 中对自定义 struct 体数组进行排序

用 fork 替换 Go 依赖:...用于两个不同的模块路径

如何将字节文件高效地读入int64切片?

在 Go 中使用 Apache Arrow 按时间间隔对事件进行分区

是否可以在调试期间在 VSCode 中预览 github.com/shopspring/decimal 值?

替换字符串中的最后一个字符

在 Cloud Run 中找不到默认凭据

缺少签名帮助文档

如何将文件上传到 Google Drive,并与使用服务帐户和 Golang 的任何人共享

go:embed 文件扩展名模式

使用 `didip/tollbooth` 限制每小时最大请求数

Go:等待多个通道的性能损失

Golang 数据库/sql 与 SetMaxOpenConns 挂起

为什么import和ImportSpec之间可以出现多行注释,而PackageName和ImportPath之间不能出现?

Unescape 在 rss 中两次逃脱了标题

使用 bolthold 3 条件进行 boltDB 查询

递归数据 struct 解组在 Go Lang Protobuf 中给出错误无法解析无效的线格式数据

关于GO的几个问题