Изглежда, че ще искате да направите две неща с това, което имате:(1) актуализирайте модела, така че да имате правилното свързване на връзката, и (2) използвайте .Preload()
метод, ако се опитвате да го накарате да асоциира данните при четене.
Промени в модела
Gorm автоматично извежда връзки въз основа на името на атрибутите във вашата структура и името на препратената структура. Проблемът е, че Google
атрибут от тип GoogleAccount
не се асоциира, защото gorm търси type Google struct
.
Липсва ви и външен ключ в GoogleAccount
. Как ORM ще знае кой GoogleAccount
за асоцииране с кой Client
? Трябва да добавите ClientId
към вашия GoogleAccount
дефиниция на структура.
Освен това бих променил първичните ключове, които използвате за въвеждане на uint
тъй като това е, което gorm има по подразбиране (освен ако нямате основателна причина да не го използвате)
Ако бях на ваше място, щях да променя дефинициите на структурата си на следното:
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
}
За повече информация относно това, разгледайте документацията на асоциациите тук:http://gorm. io/associations.html#has-one
Предварително зареждане на асоциации
Сега, когато всъщност ги имате правилно свързани, можете да .Preload()
вземете желания от вас вложен обект:
db.Preload("GoogleAccount").First(&user)
Използване на .Preload()
ще попълни user.GoogleAccount
атрибут с правилно свързания GoogleAccount
въз основа на ClientId
.
За повече информация относно това, разгледайте документацията за предварително зареждане:http://gorm .io/crud.html#preloading-eager-loading