gorm пропускают id переданный, поскольку это не должно быть брошено во время BindJson - PullRequest
0 голосов
/ 12 января 2020

Я использую приведенные ниже структуры и не хочу, чтобы gorm жаловался на дублирование идентификатора primary_key. Поэтому я попробовал следующий подход, чтобы игнорировать поле id в методе create. ie Я создал другую структуру только для создания, и gorm успешно игнорирует значение внутри переданного идентификатора. Но мне нужно получить идентификатор только что созданной записи. Который я хоть и вставил в GetID, но в нем не было идентификатора.

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

Проблема : я пытаюсь игнорировать идентификатор, переданный во время создания. Кажется, есть два возможных решения: либо Gorm игнорирует идентификатор, переданный во время создания, и возвращает новый идентификатор в поле. Или Bind Json контекста джина игнорирует значение и не привязывает его к пользовательской структуре. Любая помощь очень ценится. Спасибо

type UserBase struct {
  ID           uint `gorm:"primary_key"`
  Email        string `validate:"required,email"`
  Password     string
  LanguageId   int16
}

type UserCreateUpdate struct {
  UserBase
  ID           uint `gorm:"-",json:"id"`
  GetID           uint `gorm:"column:id",json:"id"`
  // Language language_schema.Language `json:",omitempty"`
}

type User struct {
  UserBase
  CreatedAt    time.Time
  UpdatedAt    *time.Time // As it can be null thats why the pointer
  Language language_schema.Language `json:",omitempty"`
}

// And this is create method
db := schema_utils.GetDB()

var user_create user_schema.UserCreateUpdate
c.BindJSON(&user_create)

validate := user_schema.SchemaValidator(web_api.GetValidator())
if ok, errors := schema_utils.ValidateInputs(user_create, validate); !ok {
  web_api.ValidationErrorResponse(errors, c)
} else {
  if result := db.Table("users").Create(&user_create); result.Error != nil {
    c.JSON(http.StatusUnprocessableEntity, gin.H{"error": result.Error})
  } else {
    var user user_schema.User
    fmt.Println("created")
    fmt.Println(user_create.ID)
    fmt.Println(user_create.GetID)
    db.Where("id = ?", user_create.GetID).Table("users").Preload("Language").First(&user)
    c.JSON(200, user)
  }
}
...