показать массив json внутри объекта json с помощью gorm

# #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)