亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用附加色譜柱預加載

使用附加色譜柱預加載

Go
慕神8447489 2022-08-24 16:56:15
因此,我有一個用戶表,其中每個用戶都與一個主要工具和背包中的工具相關聯。每個工具也都有一個“質量”。但是我不知道如何獲取此值,因此我很感激有關如何執行此操作的任何幫助。數據庫users+----+------+--------------+| id | name | main_tool_id |+----+------+--------------+|  1 | adam |            1 |+----+------+--------------+tools+----+-------------+| id | name        |+----+-------------+|  1 | hammer      ||  2 | screwdriver |+----+-------------+user_tools+----+---------+---------+---------+| id | user_id | tool_id | quality |+----+---------+---------+---------+|  1 |       1 |       1 | LOW     ||  2 |       1 |       2 | HIGH    |+----+---------+---------+---------+模型type User struct {    Id         int64  `json:"-"`    Name       string `json:"name"`    MainToolId int64  `json:"-"`    MainTool   Tool   `json:"main_tool"`    ToolsInBackpack []Tool `json:"tools_in_backpack" gorm:"many2many:user_tools"`}type Tool struct {    Id   int64  `json:"-"`    Name string `json:"name"`    Quality string `json:"quality"`}法典var users []UserDB.Preload("MainTool").Preload("ToolsInBackpack").Find(&users) // <-- Modify this (I guess)真實結果{    "name": "adam",    "main_tool": {        "name": "hammer",        "quality": ""    },    "tools_in_backpack": [        {            "name": "hammer",            "quality": ""        },        {            "name": "screwdriver",            "quality": ""        },    ]}期望的結果{    "name": "adam",    "main_tool": {        "name": "hammer",        "quality": "LOW"    },    "tools_in_backpack": [        {            "name": "hammer",            "quality": "LOW"        },        {            "name": "screwdriver",            "quality": "HIGH"        },    ]}非常感謝您的幫助!
查看完整描述

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


查看完整回答
反對 回復 2022-08-24
?
狐的傳說

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消息總是在重要方面存在分歧,并且試圖為兩者重用一個模型很快就會帶來痛苦。


查看完整回答
反對 回復 2022-08-24
  • 2 回答
  • 0 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號