如何使用GORM初始化具有外键约束的结构并将其插入数据库

时间:2019-06-11 17:53:00

标签: go go-gorm

我正在尝试使用golang创建一个rest API。每次创建用户时,我都想创建一个与该用户相关联的“个人资料”。

我最初的想法是先创建用户,然后分别创建引用用户ID的配置文件并将其插入数据库。

我不确定是否应该使用这种思维方式,因为我只是从语言入手。

使用以下代码,我创建了用户,但无法创建配置文件。我收到此错误:using unaddressable value

var db *gorm.DB

func GetDB() *gorm.DB {
    return db
}

type User struct {
    gorm.Model
    Email    string `gorm:"type:varchar(100);unique_index"`
    Password string `json:"password"`
    Name     string `json:"name"`
    Token    string `json:"token";sql:"-"`
}

type Profile struct {
    gorm.Model
    User        User `gorm:"foreignkey:UserRefer"` // use UserRefer as foreign key
    UserRefer   uint
    FirstName   string `gorm:"default:'John'"`
    LastName    string `gorm:"default:'Doe'"`
    Description string `gorm:"default:'Mysterious'"`
}

func (user *User) Create() (map[string]interface{}) {

    if resp, ok := user.Validate(); !ok {
        return resp
    }

    hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost)
    user.Password = string(hashedPassword)

    GetDB().Create(user)

    profile := Profile{}
    profile.UserRefer = user.ID

    GetDB().Create(profile)

    if user.ID <= 0 {
        return u.Message(false, "Failed to create account, connection error.")
    }

    response := u.Message(true, "Account has been created")
    response["user"] = user

    return response

}

我希望有人能够帮助我了解这里出了什么问题?

1 个答案:

答案 0 :(得分:0)

您应该在gorm的Create方法上传递一个指针,以在创建后填充模型...

GetDB().Create(&profile)

但是,如https://gorm.io/docs/associations.html gorm中所示,自动创建关联。

您可以像这样更改模型...(我假设用户和个人资料之间存在1..1关系好吗?) 一切都会自动完成

type User struct {
    gorm.Model
    Email     string `gorm:"type:varchar(100);unique_index"`
    Password  string `json:"password"`
    Name      string `json:"name"`
    Token     string `json:"token";sql:"-"`
    Profile   Profile
    ProfileID uint
}

type Profile struct {
    gorm.Model
    UserID      uint
    FirstName   string `gorm:"default:'John'"`
    LastName    string `gorm:"default:'Doe'"`
    Description string `gorm:"default:'Mysterious'"`
}