首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Gorm关联BeforeCreate回调未按预期工作

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

Stack Overflow用户
提问于 2020-03-06 17:33:40
回答 2查看 1.5K关注 0票数 3

我有Customer结构

代码语言:javascript
运行
复制
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结构

代码语言:javascript
运行
复制
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结构

代码语言:javascript
运行
复制
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
}

客户:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
    customer := & model.Customer{
    Email:     "a",
    //Addresses: []model.Address{
        //{
            //Address1: "abc street",
        //},
    //},
}

如何保持Address关联并成功插入这两个关联,同时仍然使用此ID生成机制?

EN

回答 2

Stack Overflow用户

发布于 2020-04-01 23:52:30

您可以使用scope.SetColumnBeforeCreate钩子中设置字段的值

代码语言:javascript
运行
复制
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

票数 2
EN

Stack Overflow用户

发布于 2021-05-27 01:06:03

您应该使用tx.Statement.SetColumn来设置GORM钩子中的字段值,例如BeforeCreate。以下是示例实现。

代码语言:javascript
运行
复制
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的参考链接

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60561188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档