I'm working on a Gin app using Gorm with MySQL. In order to define a belongs to
relationship in a Gorm Model, you have to do the following (example taken from Gorm docs):
// `User` belongs to `Company`, `CompanyID` is the foreign key
type User struct {
gorm.Model
Name string
CompanyID int
Company Company
}
type Company struct {
ID int
Name string
}
That's what I did with my models:
type Record struct {
Barcode string `json:"barcode" gorm:"size:48;unique;not null" sql:"index"`
Name string `json:"name" gorm:"size:160;unique;not null"`
ArtistID uint `json:"artist_id"`
Artist Artist `gorm:"foreignKey:ArtistID;references:ID"`
CategoryID uint `json:"category_id"`
Category Category `gorm:"foreignKey:CategoryID;references:ID"`
NumOfRecords int `json:"num_of_records" gorm:"not null"`
OriginalReleaseDate *utils.Date `json:"original_release_date" gorm:"default:null;type:date"`
ReissueReleaseDate *utils.Date `json:"reissue_release_date" gorm:"default:null;type:date"`
SideColor *string `json:"side_color" gorm:"default:null"`
BarcodeInRecord *bool `json:"barcode_in_record" gorm:"default=true"`
gorm.Model
}
type Category struct {
Name string `json:"name" gorm:"size:60;unique;not null"`
Description string `json:"description" gorm:"size:120"`
Parent uint `json:"parent" gorm:"default:null"`
Active bool `json:"active" gorm:"default:true"`
gorm.Model
}
type Artist struct {
Name string `json:"name" gorm:"size:120;unique;not null"`
Type string `json:"type" gorm:"default:null"`
CountryOfOrigin string `json:"countryOfOrigin" gorm:"default:null"`
gorm.Model
}
yet when getting data back, those two associations are not being populated:
{
"data": {
"barcode": "1231231231231292",
"name": "ABCD 12342",
"artist_id": 2,
"Artist": {
"name": "",
"type": "",
"countryOfOrigin": "",
"ID": 0,
"CreatedAt": "0001-01-01T00:00:00Z",
"UpdatedAt": "0001-01-01T00:00:00Z",
"DeletedAt": null
},
"category_id": 9,
"Category": {
"name": "",
"description": "",
"parent": 0,
"active": false,
"ID": 0,
"CreatedAt": "0001-01-01T00:00:00Z",
"UpdatedAt": "0001-01-01T00:00:00Z",
"DeletedAt": null
},
"num_of_records": 2,
"original_release_date": "1965-02-24",
"reissue_release_date": null,
"side_color": null,
"barcode_in_record": null,
"ID": 1,
"CreatedAt": "2022-04-25T12:53:32.275578-04:00",
"UpdatedAt": "2022-04-25T12:53:32.275578-04:00",
"DeletedAt": null
}
}
any idea what's going on there?
What does the code look like that is saving the data to the db?
I'm guessing that you probably need to use FullSaveAssociations
something like this:
DB().Session(&gorm.Session{FullSaveAssociations: true}).Save(&d)
To get the data back, you need to use Preloads.
DB().Preload("Artist").Preload("Category").First(&d)
you can also use
.Preload(clause.Associations)
to load them all. You can use this with other Preloads to go deeper.