Отображение внешних ключей или внешних ключей в Go GORM

Мне удалось частично решить эту проблему с помощью этого случая

К сожалению, функция Preload (), похоже, не работает с дальнейшим изучением связанного набора объектов.

Для уточнения у меня есть следующие модели:

    type Room struct {
        gorm.Model
        Name    string
        Games   []Game `gorm:"ForeignKey:RoomID"`
    }

    type Game struct {
        gorm.Model
        RoomID   int `gorm:"index"`
        Players  []Player `gorm:"ForeignKey:GameID"`
    }

    type Player struct {
        gorm.Model
        Name   string
        GameID int `gorm:"index"`
    }

Когда я создаю новый объект с созданным новым объектом Room, Game и Player, я получаю следующие данные (в кодировке json):

    {"Value":{"ID":26,"CreatedAt":"2016-05-15T01:21:22.426234189-07:00","UpdatedAt":"2016-05-15T01:21:22.426234189-07:00","DeletedAt":null,"Name":"foo","Games":[{"ID":17,"CreatedAt":"2016-05-15T01:21:22.427026134-07:00","UpdatedAt":"2016-05-15T01:21:22.427026134-07:00","DeletedAt":null,"RoomID":26,"Turns":null,"Players":[{"ID":4,"CreatedAt":"2016-05-15T01:21:22.427560561-07:00","UpdatedAt":"2016-05-15T01:21:22.427560561-07:00","DeletedAt":null,"Name":"TestPlayer","GameID":17}],"Counter":1,"Assigned":false}],"Testing":false},"Error":null,"RowsAffected":1}

Но если я попытаюсь запросить структуру с помощью функции preload (), я получу следующее:

    {"Value":{"ID":26,"CreatedAt":"2016-05-15T01:21:22.426234189-07:00","UpdatedAt":"2016-05-15T01:21:22.426234189-07:00","DeletedAt":null,"Name":"foo","Games":[{"ID":17,"CreatedAt":"2016-05-15T01:21:22.427026134-07:00","UpdatedAt":"2016-05-15T01:21:22.427026134-07:00","DeletedAt":null,"RoomID":26,"Turns":null,"Players":null,"Counter":1,"Assigned":false}],"Testing":false},"Error":null,"RowsAffected":1}

Обратите внимание, что раздел «Игроки» теперь пуст. Вот мои функции регистрации комнаты и запроса комнаты:

    func RegisterRoom(w http.ResponseWriter, r *http.Request) {
        err := r.ParseForm()

        if err != nil {
            // Handle error
        }
        // r.PostForm is a map of our POST form values
        room := Room{
            Name: r.PostFormValue("label"),
            Games: []Game{{
                Counter: 1,
                Players: []Player{{Name: r.PostFormValue("username")}},
            }},
        }
        t := db.Create(&room)
        if err := json.NewEncoder(w).Encode(t); err != nil {
            panic(err)
        }
    }

func RoomShow(w http.ResponseWriter, r *http.Request) {
    var rm Room
    vars := mux.Vars(r)
    roomId := vars["roomId"]
    id, _ := strconv.Atoi(roomId)
    room := db.Preload("Games").First(&rm, id)
    result := db.Find(&room)
    json.NewEncoder(w).Encode(result)
}

person Braden Jagman    schedule 15.05.2016    source источник
comment
Решил! Ответ находился в вложенной предварительной загрузке   -  person Braden Jagman    schedule 15.05.2016


Ответы (1)


Решил! Ответ был в разделе Вложенная предварительная загрузка шлепает по лбу

person Braden Jagman    schedule 15.05.2016