为了账号安全,请及时绑定邮箱和手机立即绑定

使用附加色谱柱预加载

使用附加色谱柱预加载

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条经验 获得超7个赞

如果您不需要 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 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信