获取嵌套结构

时间:2021-01-10 17:29:23

标签: go go-gorm gorm-mysql

我有以下结构:

type Users struct {
    ID           int64            `gorm:"id" json:"id"`
    Name         int64            `gorm:"name" json:"name"`
    UserTypeID   int              `gorm:"column:user_type_id" json:"-"`
    UserType     BusinnesUserType `gorm:"foreignKey:id;references:user_type_id" json:"user_type"`
    LanguageID   int64            `gorm:"column:language_id" json:"-"`
    Language     Language         `gorm:"foreignKey:ID;references:LanguageID" json:"language"`
}
type BusinnesUserType struct {
    ID          int64           `gorm:"id" json:"id"`
    Description json.RawMessage `gorm:"description" json:"description"`
}
type Language struct {
    ID          int64           `gorm:"id" json:"id"`
    Description json.RawMessage `gorm:"description" json:"description"`
}

我想得到类似的东西:

{
   "id":1,
   "name":"dd",
   "user_type":{
      "id":1,
      "description":{
         "en":"admin"
      }
   },
   "language":{
      "id":1,
      "description":{
         "en":"English"
      }
   }
}

这是我对 mysql 的 gorm 查询:

db.Preload("UserType").Preload("Language").Where("id=?",1).Find(&user)

如果我使用 Debug() 选项,我会看到:

SELECT * FROM `languages` WHERE `languages`.`id` = 1 
SELECT * FROM `business_user_types` WHERE `business_user_types`.`id` = 1 
SELECT * FROM `users` WHERE `id` = 1 

但我得到以下 json:

{
   "id":1,
   "name":"dd",
   "user_type":{
      "id":null,
      "description":null
   },
   "language":{
      "id":null,
      "description":null
   }
}

我以错误的方式使用了 preload 命令?我已经尝试过加入和关联,同样的结果。

2 个答案:

答案 0 :(得分:0)

  • 我认为用户模型应该如下所示..
type Users struct {
    ID           int64            `gorm:"id" json:"id"`
    Name         int64            `gorm:"name" json:"name"`
    UserTypeID   int              `gorm:"column:user_type_id" json:"-"`
    UserType     BusinnesUserType `gorm:"foreignKey:UserTypeID;" json:"user_type"` // changed this line
    LanguageID   int64            `gorm:"column:language_id" json:"-"`
    Language     Language         `gorm:"foreignKey:LanguageID;" json:"language"` // changed this line
}
  • 改变了这一行..
Language     Language         `gorm:"foreignKey:LanguageID;" json:"language"`

UserType     BusinnesUserType `gorm:"foreignKey:UserTypeID;" json:"user_type"`
  • 编辑你也必须手动设置外键
// User : Relations
DB.Model(&models.Users{}).AddForeignKey("user_type_id", "Businnesusertypes(id)", "<CASCADE/RESTRICT>", "<CASCADE/RESTRICT>")
DB.Model(&models.Users{}).AddForeignKey("language_id", "languages(id)", "<CASCADE/RESTRICT>", "<CASCADE/RESTRICT>")

答案 1 :(得分:0)

我已经找到了解决方案。问题出在“预加载”函数中,因为需要与预加载表的关系。 现在,我的 gorm 查询是这样的:

result := db.Preload("UserType", "id=?", &user.UserTypeID).
        Preload("Language", "id=?", &user.LanguageID).
        Where("business_users.id=?", 1).Find(&user)

我的结构是这样的:

type BusinessUsers struct {
    gorm.Model
    Name           string `gorm:"name" json:"name"`
    UserTypeID     int64
    UserType       BusinessUserType `gorm:"foreignkey:UserTypeID"`
    LanguageID     int64
    Language       Language `gorm:"foreignkey:LanguageID"`
}