Search code examples
mysqlgogo-gormbelongs-togo-gin

Golang Gorm not retrieving data from associated table


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?


Solution

  • 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.

    https://gorm.io/docs/preload.html#content-inner