【问题标题】:gorm Many To Many Select gives invalid association [] errorgorm 多对多选择给出无效的关联 [] 错误
【发布时间】:2016-04-12 13:18:43
【问题描述】:

这是我的数据库架构:

用户:

id uuid PRIMARY KEY ,   title character
"1234"                  "ABCD"

语言:

id uuid PRIMARY KEY ,   name character
"1122"                  "eng"
"1133"                  "man"

用户语言:

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" : ["eng", "man"]

【问题讨论】:

  • db.Model(&user).Related(&languages) 不需要是db.Model(&user).Related(user.languages) 吗?我的意思是,即使该语句成功,您返回的用户对象也会有一个空的语言数组,因为您从未分配给它,只分配给局部变量。

标签: go many-to-many go-gorm


【解决方案1】:

你可以试试:

db.Model(&user).Related(&languages, "Languages") 

更多示例可以在test中找到

【讨论】:

  • 所以这对我也有用,但是 gorm 网站上的文档并没有说你必须指定外键。事实上,我在我的结构定义中指定了 ForeignKey 和 AssociationForeignKey 标签,如果没有在Related API 中显式添加列名,它仍然无法工作......
【解决方案2】:

我认为您需要使用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
}

【讨论】:

  • 你能解释一下你用Association而不是Relation吗?
  • 据我所知,Association 只是 Gorm 中关系的名称。文档页面非常适合传达这个想法:jinzhu.me/gorm/associations.html
猜你喜欢
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
相关资源
最近更新 更多