使用gorm显示json对象内部的json数组



我试图使用gorm为我的查询。我有一个叫做用户的模型,就像这样:

type Users struct {
gorm.Model
ID          uint   `gorm:"autoIncrement;unique" json:"id"`
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"`
}

和另一个表示用户已购买的课程的模型。

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
UpdatedAt       time.Time
}

现在我正在寻找一种方法,根据他们的分数与他们购买的课程返回前100名用户。换句话说,下面的JSON对象是理想的:

{
"users":[
{
"id":1,
"phoneNumber":"99999999",
"name":"test",
"rank":1,
"score":123456789,
"image":"http://...",
"email":"test@test.com",
"address":"test",
"birthday":"2021-01-01",
"biography":"test here",
"courses": [
{
"course_id":1,
"user_phone_number":"99999999",
"progress": 53,
"created_at": "2021-01-01",
"updated_at": "2021-01-01",
} ,
{
"course_id":2,
"user_phone_number":"99999999",
"progress":100,
"created_at":"2021-02-01",
"updated_at":"2021-03-01",
}
]
}
]
}

我知道我必须使用下面的查询来获得前100名用户:

database.myDatabase.Order("rank asc").Limit(100).Find(users)

但不幸的是,我不知道如何编写适合上述输出的格式。

如果您这样扩展Users模型:

type Users struct {
gorm.Model
ID          uint   `gorm:"autoIncrement;unique" json:"id"`
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"`
}

,然后可以使用:

将课程预加载到user结构体中
database.myDatabase.Preload("Courses").Order("rank asc").Limit(100).Find(users)

相关内容

  • 没有找到相关文章

最新更新