Gorm 使用模型如何控制返回列

本人GO新手,正在学习gorm,有个问题一直找不到方法,想来请教下各位,拜托了

我定义文章表模型 Post,其中images字段存放的是图片数组json字符串,模型使用 AfterFind HOOK,借用ImagesStr读取图片字符串,再转为 []PostImage,放到实际想返回字符:images

package models
import ....
type Post struct {
    Id               int         `json:"id" gorm:"id;primaryKey"`
    Title            string      `json:"title" gorm:"title"`
    //...此处省略其他无关字段
    ImagesStr        string      `json:"-" gorm:"column:images"`
    Images           []PostImage `json:"images" gorm:"-"`
}
// 图片结构
type PostImage struct {
    Name   string `json:"name"`
    Url    string `json:"url"`
}
// 处理json串返回格式
func (data *Post) AfterFind(tx *gorm.DB) error {
        //...省略其他代码
    json.Unmarshal([]byte(data.ImagesStr), &data.Images)
    return nil
}
  1. 当我用 map[string]interface{}{}接收结果返回时,不会触发 AfterFind,得到images是字符串。
    代码如下:

    postlist := map[string]interface{}{}
    db.Model(&Post).Select("id,images").Find(&postlist)
  2. 当我用 []Post作为结果返回时,结果会把所有Post模型定义过的字段都返回,没有selectg到的字段会返回字段类型的默认值
    代码如下:

    var postlist []Post
    db.Model(&Post).Select("id,images").Find(&postlist)
  3. 如果重定义struct来接收查询结果 ,又感觉model已经定义过了

    type ResPost struct{
        Id int 
        Images []PostImage
    }
    var postlist []ResPost
    db.Model(&Post).Select("id,images").Find(&postlist)

如何才能让返回结果只返回Select("xx,xxx")选中字段,当有images字段,又会自动把images转为数组??

阅读 5.3k
1 个回答

应该这么写:

db.Model(&Post).Select("id","images").Find(&postlist)

看gorm的源码,SELECT语句并没有使用,来分隔,所以你应该传入一个切片。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题