使用附加色谱柱预加载

因此,我有一个用户表,其中每个用户都与一个主要工具和背包中的工具相关联。每个工具也都有一个“质量”。但是我不知道如何获取此值,因此我很感激有关如何执行此操作的任何帮助。


数据库


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 []User

DB.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"

        },

    ]

}

非常感谢您的帮助!


慕神8447489
浏览 98回答 2
2回答

慕仙森

如果您不需要 MainTool 返回对象。也许你使用它type User struct {&nbsp; &nbsp; ID&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;uint `json:"-"`&nbsp; &nbsp; Name&nbsp; &nbsp; &nbsp; &nbsp;string&nbsp; &nbsp; MainTool&nbsp; &nbsp;int64&nbsp; &nbsp; ToolsInBackpack&nbsp; string&nbsp; &nbsp; Tools []*Tool}type Tool struct {&nbsp; &nbsp; ID&nbsp; &nbsp;uint`json:"-"`&nbsp; &nbsp; Name string&nbsp; &nbsp; UserID uint}User{MainTool: 1, ToolsInBackpack: "[1,2]", Tools: []*Tool{&t1, &t2}}如果你不想使用字符串 at 你不能使用,例如ToolsInBackpack&nbsp; stringdatatypes.JSONgorm.io/datatypesToolsInBackpack&nbsp; datatypes.JSON

狐的传说

这在Gorm中不受支持,因此不会有一个简单的方法来预加载并且它完成了。以下是您可以查看的一些技术:使用包含所需字段的自定义联接表模型type UserTool struct {&nbsp; &nbsp; UserID int64 `gorm:"primaryKey"`&nbsp; &nbsp; ToolID int64 `gorm:"primaryKey"`&nbsp; &nbsp; Quality string&nbsp;}err := db.SetupJoinTable(&User{}, "ToolsInBackpack", &UserTool{})// handle error(我省略了 UserTools.ID 字段,Gorm不需要它,只有当用户可以拥有相同的工具两次时,你才需要它,在这种情况下,将其作为主密钥的一部分放回去。我不知道Gorm是否会对此感到满意,但请尝试一下)。然后,您可以使用此模型像查询任何其他模型一样查询字段:userTools := []UserToolerr := 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 {&nbsp; &nbsp; ID&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int64&nbsp;&nbsp;&nbsp; &nbsp; Name&nbsp; &nbsp; &nbsp; &nbsp;string&nbsp;&nbsp; &nbsp; MainToolId int64&nbsp;&nbsp;&nbsp; &nbsp; MainTool&nbsp; &nbsp;Tool&nbsp; &nbsp; ToolsInBackpack []UserTool}type UserTool struct {&nbsp; &nbsp; UserID&nbsp; &nbsp;int64&nbsp; `gorm:"primaryKey"`&nbsp; &nbsp; ToolID&nbsp; &nbsp;int64&nbsp; `gorm:"primaryKey"`&nbsp; &nbsp; Tool&nbsp; &nbsp; &nbsp;Tool&nbsp; &nbsp; Quality&nbsp; string}type Tool struct {&nbsp; &nbsp; ID int64&nbsp; &nbsp; Name string}现在,您可以像这样预加载此关联:err := db.Model(&User{}).Preload("ToolsInBackpack.Tool").Find(&users).Error// handle error// now users[i].ToolsInBackpack[j].Quality and&nbsp;// users[i].ToolsInBackpack[j].Tool.Name will be set correctly.现在唯一的问题是,你在模型中有一个奇怪的形状,然后你试图将其封送到JSON中(最有可能在API中使用)。我的建议是将数据库模型与 JSON API 模型拆分,并在代码中有一个映射层。DB模型和API消息总是在重要方面存在分歧,并且试图为两者重用一个模型很快就会带来痛苦。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go