Wygląda na to, że będziesz chciał zrobić dwie rzeczy z tym, co masz:(1) zaktualizować model, aby uzyskać właściwe powiązanie relacji i (2) użyć .Preload()
metoda, jeśli próbujesz skojarzyć dane podczas odczytu.
Zmiany modelu
Gorm automatycznie wnioskuje relacje na podstawie nazwy atrybutów w Twojej strukturze i nazwy struktury, do której się odwołuje. Problem polega na tym, że Google
atrybut typu GoogleAccount
nie kojarzy się, ponieważ gorm szuka type Google struct
.
Brakuje Ci też klucza obcego na GoogleAccount
. Skąd ORM miałby wiedzieć, które GoogleAccount
skojarzyć z którym Client
? Powinieneś dodać ClientId
na Twoje GoogleAccount
definicja struktury.
Ponadto zmieniłbym klucze podstawowe, których używasz do wpisywania uint
ponieważ domyślnie jest to gorm (chyba że masz dobry powód, aby go nie używać)
Gdybym był tobą, zmieniłbym moje definicje struktur na następujące:
type Client struct {
IdClient uint `gorm:"primary_key"`
Name string
PhotoUrl string
ApprovalNumber uint16
Phone string
Password string
HoursOfNotice int8
GoogleAccount GoogleAccount // Change this to `GoogleAccount`, the same name of your struct
}
type GoogleAccount struct {
Id uint
ClientId uint // Foreign key
Token string
}
Aby uzyskać więcej informacji na ten temat, zapoznaj się z dokumentacją stowarzyszenia tutaj:http://gorm. io/associations.html#has-one
Wstępne ładowanie powiązań
Teraz, gdy już masz je właściwie powiązane, możesz .Preload()
pobierz żądany obiekt zagnieżdżony:
db.Preload("GoogleAccount").First(&user)
Używanie .Preload()
wypełni user.GoogleAccount
atrybut z poprawnie powiązanym GoogleAccount
na podstawie ClientId
.
Więcej informacji na ten temat można znaleźć w dokumentacji dotyczącej wstępnego ładowania:http://gorm .io/crud.html#preloading-eager-loading