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
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 关注
- 91 浏览
添加回答
举报