2 回答
TA貢獻1827條經驗 獲得超8個贊
如果您不需要 MainTool 返回對象。
也許你使用它
type User struct {
ID uint `json:"-"`
Name string
MainTool int64
ToolsInBackpack string
Tools []*Tool
}
type Tool struct {
ID uint`json:"-"`
Name string
UserID uint
}
User{MainTool: 1, ToolsInBackpack: "[1,2]", Tools: []*Tool{&t1, &t2}}
如果你不想使用字符串 at 你不能使用,
例如ToolsInBackpack stringdatatypes.JSONgorm.io/datatypes
ToolsInBackpack datatypes.JSON
TA貢獻1804條經驗 獲得超3個贊
這在Gorm中不受支持,因此不會有一個簡單的方法來預加載并且它完成了。
以下是您可以查看的一些技術:
使用包含所需字段的自定義聯接表模型
type UserTool struct {
UserID int64 `gorm:"primaryKey"`
ToolID int64 `gorm:"primaryKey"`
Quality string
}
err := db.SetupJoinTable(&User{}, "ToolsInBackpack", &UserTool{})
// handle error
(我省略了 UserTools.ID 字段,Gorm不需要它,只有當用戶可以擁有相同的工具兩次時,你才需要它,在這種情況下,將其作為主密鑰的一部分放回去。我不知道Gorm是否會對此感到滿意,但請嘗試一下)。
然后,您可以使用此模型像查詢任何其他模型一樣查詢字段:
userTools := []UserTool
err := db.Where("user_id = ?", user.ID).Find(&userTools).Error
// handle error
// now userTools[i].Quality is filled, you could use it to update the corresponding users[j].ToolsInBackpack[k].Quality
這很痛苦,因為您需要將匹配ID作為后處理步驟。
使用“具有多個/屬于”混合關系對“對”多對多連接表進行建模:
在這里,用戶有許多用戶工具,一個工具屬于一個或多個用戶工具。這有效地模擬了多對多的含義(在ERD中,像這樣的關系可以分解為)。[User]>--<[Tool][User]--<[UserTool]>--[Tool]
type User struct {
ID int64
Name string
MainToolId int64
MainTool Tool
ToolsInBackpack []UserTool
}
type UserTool struct {
UserID int64 `gorm:"primaryKey"`
ToolID int64 `gorm:"primaryKey"`
Tool Tool
Quality string
}
type Tool struct {
ID int64
Name string
}
現在,您可以像這樣預加載此關聯:
err := db.Model(&User{}).Preload("ToolsInBackpack.Tool").Find(&users).Error
// handle error
// now users[i].ToolsInBackpack[j].Quality and
// users[i].ToolsInBackpack[j].Tool.Name will be set correctly.
現在唯一的問題是,你在模型中有一個奇怪的形狀,然后你試圖將其封送到JSON中(最有可能在API中使用)。我的建議是將數據庫模型與 JSON API 模型拆分,并在代碼中有一個映射層。DB模型和API消息總是在重要方面存在分歧,并且試圖為兩者重用一個模型很快就會帶來痛苦。
- 2 回答
- 0 關注
- 131 瀏覽
添加回答
舉報
