Gorm Associations BeforeCreate Callback не работает должным образом - PullRequest
0 голосов
/ 06 марта 2020

У меня Customer struct

type Customer struct {
    Model
    Email                 string     `json:"email,omitempty"`
    Addresses             []Address
}

func (c *Customer) BeforeCreate() (err error) {
    if err := c.GenerateID(); err != nil {
        return err
    }
    return c.Marshal()
}

А Address struct

type Address struct {
    Model
    CustomerID         string
    Address1           string
}

func (a *Address) BeforeCreate() error {
// The ID is still generated, but the insert query has no `id` in it
    if err := a.GenerateID(); err != nil {
        return err
    }
    return nil
}

Model struct

type Model struct {
    ID        string `gorm:"primary_key;type:varchar(100)"`
    CreatedAt time.Time
    UpdatedAt time.Time
    DeletedAt *time.Time `sql:"index"`
}

func (model *Model) GenerateID() error {
    uv4, err := uuid.NewV4()
    if err != nil {
        return err
    }
    model.ID = uv4.String()
    return nil
}

A Заказчик:

customer := &model.Customer{
    Email:     "a",
    Addresses: []model.Address{
        {
            Address1: "abc street",
        },
    },
}


if err := gormDb.Create(customer).Error; err != nil {
    return nil, err
}

I got an error: Error 1364: Field 'id' doesn't have a default value для объекта Address

Но если я удаляю ассоциации Address, все работает. И клиентский Id генерируется.

    customer := & model.Customer{
    Email:     "a",
    //Addresses: []model.Address{
        //{
            //Address1: "abc street",
        //},
    //},
}

Как я могу сохранить Address ассоциации и успешно вставить и все еще, используя этот механизм генерации идентификаторов?

1 Ответ

0 голосов
/ 01 апреля 2020

Вы можете использовать scope.SetColumn для установки значения поля в BeforeCreate hook

func (a *Address) BeforeCreate(scope *gorm.Scope) error {
  scope.SetColumn("ID", uuid.New())
  return nil
}

Ref: https://gorm.io/docs/create.html#Setting -Field-Values-In-Hooks

...