使用GORM查询积分前100用户并返回包含其已购课程数组的JSON结果
解决方案
步骤1:调整Users模型添加关联关系
先在原有Users模型中新增和UserCourse的关联字段,GORM会自动根据外键规则匹配用户对应的已购课程:
import "gorm.io/gorm" import "time" type Users struct { // 如果你不需要gorm.Model自带的CreatedAt/UpdatedAt/DeletedAt字段,可以直接删除gorm.Model,避免序列化时返回多余字段 gorm.Model ID uint `gorm:"autoIncrement;unique" json:"id"` // 如果要匹配输出要求的驼峰格式phoneNumber,把json标签改成json:"phoneNumber"即可 PhoneNumber string `gorm:"primaryKey" json:"phone_number"` Name string `gorm:"default:dear user" json:"name"` Rank uint `json:"rank"` Score uint `json:"score"` Image string `json:"image"` Email string `json:"email"` Address string `json:"address"` Birthday string `json:"birthday"` Biography string `json:"biography"` // 新增关联字段,关联用户已购课程 Courses []UserCourse `gorm:"foreignKey:UserPhoneNumber;references:PhoneNumber" json:"courses"` } type UserCourse struct { CourseID uint `gorm:"primaryKey" json:"course_id"` UserPhoneNumber string `gorm:"primaryKey" json:"user_phone_number"` Progress uint `json:"progress"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` }
步骤2:使用预加载查询数据
调用GORM的Preload方法即可在查询用户的同时自动拉取关联的课程数据:
// 定义接收查询结果的变量 var users []Users // 预加载关联课程,同时查询排名前100的用户 err := database.myDatabase.Preload("Courses").Order("rank asc").Limit(100).Find(&users).Error if err != nil { // 自行处理查询错误逻辑 panic(err) }
步骤3:封装输出结构
按照你要求的JSON格式封装外层结构即可:
// 定义外层返回结构 type Response struct { Users []Users `json:"users"` } // 封装查询到的数据 res := Response{ Users: users, } // 直接序列化res变量即可得到目标格式的JSON
补充说明
- 如果需要UserCourse的时间字段输出
2021-01-01格式,你可以给CreatedAt/UpdatedAt字段自定义JSON序列化方法,或者直接把字段类型改成string存储 - 数据量极大的场景下可以用Joins关联查询代替Preload减少SQL查询次数,普通业务场景Preload的写法足够简洁易用
内容的提问来源于stack exchange,提问作者Mohammad Derakhshan
相关产品推荐
相关产品推荐

