我有Customer结构
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结构
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结构
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
}客户:
customer := &model.Customer{
Email: "a",
Addresses: []model.Address{
{
Address1: "abc street",
},
},
}
if err := gormDb.Create(customer).Error; err != nil {
return nil, err
}Address对象的I got an error: Error 1364: Field 'id' doesn't have a default value
但是,如果我删除Address关联,一切都会正常工作。并生成客户的Id。
customer := & model.Customer{
Email: "a",
//Addresses: []model.Address{
//{
//Address1: "abc street",
//},
//},
}如何保持Address关联并成功插入这两个关联,同时仍然使用此ID生成机制?
发布于 2020-04-01 23:52:30
您可以使用scope.SetColumn在BeforeCreate钩子中设置字段的值
func (a *Address) BeforeCreate(scope *gorm.Scope) error {
scope.SetColumn("ID", uuid.New())
return nil
}参考:https://v1.gorm.io/docs/create.html#Setting-Field-Values-In-Hooks
发布于 2021-05-27 01:06:03
您应该使用tx.Statement.SetColumn来设置GORM钩子中的字段值,例如BeforeCreate。以下是示例实现。
func (s Product3) BeforeCreate(tx *gorm.DB) (err error) {
tx.Statement.SetColumn("Price", s.Price+100)
return nil
}GORM Github repo https://github.com/go-gorm/gorm/blob/ac722c16f90e0e0dffc600c7f69e791c110d788c/tests/hooks_test.go#L306-L309的参考实现链接
来自GORM文档https://gorm.io/docs/update.html#Change-Updating-Values的参考链接
https://stackoverflow.com/questions/60561188
复制相似问题