Nit*_*tin 7 many-to-many go go-gorm
这是我的数据库架构:
用户:
id uuid PRIMARY KEY , title character
"1234" "ABCD"
Run Code Online (Sandbox Code Playgroud)
语言:
id uuid PRIMARY KEY , name character
"1122" "eng"
"1133" "man"
Run Code Online (Sandbox Code Playgroud)
user_languages:
user_id uuid, language_id uuid
"1234" "1122"
"1234" "1133"
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
type User struct {
Id uuid.UUID `json:"id" gorm:"primary_key"`
Title string `json:"title"`
Languages []Language `json:"languages" gorm:"many2many:user_languages;"`
}
type Language struct {
ID uuid.UUID `json:"id" gorm:"primary_key"`
Name string `json:"name"`
}
func GetUser(id string) User {
user := User{}
languages := Language{}
db.Where("id = ?", id).Find(&user)
// SELECT * FROM users WHERE 'id' = id;
db.Model(&user).Related(&languages)
// SELECT * FROM "languages" INNER JOIN "user_languages" ON "user_languages"."language_id" = "languages"."id" WHERE "user_languages"."user_id" = 111
return user
}
Run Code Online (Sandbox Code Playgroud)
我期待这个结果:
{
"id": "1234",
"title": "ABCD",
"languages" : [{
"id" : "1122",
"name" : "eng"
},{
"id" : "1122",
"name" : "eng"
}]
}
Run Code Online (Sandbox Code Playgroud)
但我正在invalid association []使用控制台,添加一个gorm logger没有提供更多信息.
即使我只能获得像语言名称数组这样的"语言"对象,这也很好:
"languages" : ["eng", "man"]
Run Code Online (Sandbox Code Playgroud)
你可以尝试:
db.Model(&user).Related(&languages, "Languages")
Run Code Online (Sandbox Code Playgroud)
在测试中可以找到更多示例
我认为你需要使用Association. 您还可以使用 更简洁地获取匹配的用户db.First(&user, id)。
func GetUser(id string) User {
var user User
db.First(&user, id)
db.Model(&user).Association("Languages").Find(&user.Languages)
return user
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5488 次 |
| 最近记录: |