英文:
gorm Many To Many Select gives invalid association [] error
问题
这是我的数据库模式:
users表:
id uuid PRIMARY KEY, title character
"1234" "ABCD"
languages表:
id uuid PRIMARY KEY, name character
"1122" "eng"
"1133" "man"
user_languages表:
user_id uuid, language_id uuid
"1234" "1122"
"1234" "1133"
这是我的代码:
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
}
我期望得到以下结果:
{
"id": "1234",
"title": "ABCD",
"languages": [{
"id": "1122",
"name": "eng"
}, {
"id": "1122",
"name": "eng"
}]
}
但是我在控制台上得到了invalid association []
的错误提示,添加gorm日志记录器也没有提供更多信息。
即使我只能得到一个类似于语言名称数组的"languages"对象,也可以接受:
"languages": ["eng", "man"]
英文:
This is my db schema:
users :
id uuid PRIMARY KEY , title character
"1234" "ABCD"
languages :
id uuid PRIMARY KEY , name character
"1122" "eng"
"1133" "man"
user_languages :
user_id uuid, language_id uuid
"1234" "1122"
"1234" "1133"
This is my code:
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
}
I am expecting this result:
{
"id": "1234",
"title": "ABCD",
"languages" : [{
"id" : "1122",
"name" : "eng"
},{
"id" : "1122",
"name" : "eng"
}]
}
But I am getting invalid association []
on console, adding a gorm logger did not provide more information.
Even if I can only get a "languages" object like an array of languages names, this is also fine:
"languages" : ["eng", "man"]
答案1
得分: 10
你可以尝试使用以下代码:
db.Model(&user).Related(&languages, "Languages")
更多示例可以在test中找到。
英文:
You may try:
db.Model(&user).Related(&languages, "Languages")
More examples can be find in the test
答案2
得分: 1
我认为你需要使用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
}
请注意,我已经将代码中的&
替换为了正确的符号。
英文:
I think you need to use Association
. You can also get the matching user more succinctly using 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
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论