# #json #go #go-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)
но, к сожалению, я понятия не имею, как написать gorm, подходящий для упомянутого вывода.
Комментарии:
1. Является
UserCourse
ли это столбцомUsers
или это отдельная таблица и связь с внешним ключом? Каким был бы ваш обычный SQL-запрос, чтобы определить 100 лучших пользователей? Можете ли вы также добавить свою схему базы данных?2. @ShaileshSuryawanshi спасибо за ваше внимание. да, курс пользователя-это совсем другая таблица, содержащая курсы, которые есть у каждого пользователя. обычный SQL для получения лучших пользователей прост:
select * from users order by rank asc limit 100
3. Я считаю, что между пользователем и пользовательскими ресурсами существует одна связь ко многим. Чтобы получить результаты
user with UserCourses
, вам, возможно, потребовалось написать сложный SQL-запрос/объединение? Я не вижу ограничения внешнего ключа вUser
модели дляUserCourse
такого вопроса. Чтобы получить ожидаемый ответ Json, вам, возможно, потребуется упорядочить структуру из базы данных, отсюда и вопрос.
Ответ №1:
Если вы расширите свою 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"`
}
затем вы можете предварительно загрузить курсы в пользовательскую структуру с помощью:
database.myDatabase.Preload("Courses").Order("rank asc").Limit(100).Find(users)