Golang Gorm无法从关联表中检索数据。

huangapple go评论70阅读模式
英文:

Golang Gorm not retrieving data from associated table

问题

我正在使用Gorm和MySQL开发一个Gin应用程序。为了在Gorm模型中定义“属于”关系,你需要按照以下步骤进行操作(示例取自Gorm文档):

// `User`属于`Company`,`CompanyID`是外键
type User struct {
  gorm.Model
  Name      string
  CompanyID int
  Company   Company
}

type Company struct {
  ID   int
  Name string
}

这是我在我的模型中所做的:

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
}

然而,在获取数据时,这两个关联对象没有被填充:

{
    "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
    }
}

有什么想法是怎么回事吗?

英文:

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?

答案1

得分: 2

保存数据到数据库的代码是怎样的?

我猜你可能需要使用FullSaveAssociations,类似这样:

DB().Session(&gorm.Session{FullSaveAssociations: true}).Save(&d)

要获取数据,你需要使用Preloads。

DB().Preload("Artist").Preload("Category").First(&d)

你还可以使用

.Preload(clause.Associations)

来加载它们。你可以与其他Preloads一起使用,以深入加载。

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

英文:

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

huangapple
  • 本文由 发表于 2022年4月26日 01:11:52
  • 转载请务必保留本文链接:https://go.coder-hub.com/72003273.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定