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

发布于 2022-09-13 00:37:55 字数 1776 浏览 24 评论 0

本人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转为数组??

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一个人练习一个人 2022-09-20 00:37:55

应该这么写:

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文