为了账号安全,请及时绑定邮箱和手机立即绑定

Gorm 关联 BeforeCreate 回调未按预期工作

Gorm 关联 BeforeCreate 回调未按预期工作

Go
青春有我 2022-05-18 17:01:26
我有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}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 生成机制?
查看完整描述

2 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

您可以使用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


查看完整回答
反对 回复 2022-05-18
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

您应该使用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


查看完整回答
反对 回复 2022-05-18
  • 2 回答
  • 0 关注
  • 391 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信