Как начать и вставить структуру с ограничением внешнего ключа в БД, используя GORM - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь создать API отдыха с Голангом.Каждый раз, когда создается пользователь, я хотел бы создать «Профиль», связанный с этим пользователем.

Первоначально я думал о том, чтобы сначала создать пользователя, а затем отдельно создать профиль, ссылающийся на идентификатор пользователя и вставить его в базу данных.

Я не уверен, следует ли использовать этот тип мышления в соответствии с тем, как идут дела, поскольку я только начинаю с языка.

Используя приведенный ниже код, я создаю пользователя, но не могу создать профиль.Я получаю эту ошибку: 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 голосов
/ 12 июня 2019

Вы должны передать указатель на метод 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'"`
}
...