首頁 > 後端開發 > Golang > 主體

有沒有辦法為結構內的每個結構執行 BeforeCreate 和 BeforeUpdate 掛鉤?

PHPz
發布: 2024-02-05 21:48:08
轉載
861 人瀏覽過

有没有办法为结构内的每个结构执行 BeforeCreate 和 BeforeUpdate 挂钩?

問題內容

我有以下程式碼:

type innerstructa struct {
 a string
}

type innerstructb struct {
 b string
}

func (a *a) beforecreate(scope *gorm.scope) error {
    return scope.setcolumn("a", uuid.new().string())
}

func (b *b) beforecreate(scope *gorm.scope) error {
    return scope.setcolumn("b", uuid.new().string())
}

type outerstruct struct {
    innerstructa
    innerstructb
    id      string `gorm:"type:varchar(40);not null"`
}
登入後複製

當我建立記錄時:

outerStructObject := OuterStruct{
        ID:          "sample_ID",
    }
err := db.Create(&outerStructObject).Error
登入後複製

僅呼叫 beforecreate() 掛鉤之一。其他 beforecreate 被跳過。

gorm版本為jinzhu/gorm v1.9.16

##有沒有一種方法可以在呼叫 create 語句時呼叫兩個鉤子?

預計為兩個內部結構呼叫 beforecreate 掛鉤 - innerstructa 和 innerstructb。


正確答案


peter 的評論是準確的,我將在這裡分享我的測試和評論,但使用官方存儲庫go -gorm/ gorm 和最新版本v1.25.0 具有非常相似的結果和api 中的一些變更。

建立外部註冊表時,內部物件可以這樣設定:

func (o *outerstruct) beforecreate(tx *gorm.db) error {
    fmt.println("hook triggered: beforecreate for outerstruct")
    o.innerstructa.a = uuid.new().string()
    o.innerstructb.b = uuid.new().string()
    return nil
}
登入後複製

要觸發內部物件鉤子,只能透過直接建立它們:

innera := innerstructa{
    a: "123",
}

errcreateinner := db.create(&innera).error
登入後複製

這是一個完整的孤立範例:

package main

import (
    "fmt"
    "log"

    "github.com/google/uuid"
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)

func main() {

    db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
    if err != nil {
        panic(err)
    }

    db.AutoMigrate(&InnerStructA{}, &InnerStructB{}, &OuterStruct{})

    outerStructObject := OuterStruct{
        ID: "sample_ID",
    }

    errCreate := db.Create(&outerStructObject).Error
    if err != nil {
        log.Fatal(errCreate)
    }

    var outer OuterStruct
    db.Last(&outer)
    fmt.Println("Last register: ", outer)

    // innerA := InnerStructA{
    //  A: "123",
    // }

    // errCreateInner := db.Create(&innerA).Error
    // if err != nil {
    //  log.Fatal(errCreateInner)
    // }
}

type InnerStructA struct {
    A string
}

type InnerStructB struct {
    B string
}

// This is not being called
func (a *InnerStructA) BeforeCreate(tx *gorm.DB) error {
    fmt.Println("Hook triggered: BeforeCreate for InnerStructA")
    // ...
    return nil
}

// This is not being called
func (b *InnerStructB) BeforeCreate(tx *gorm.DB) error {
    fmt.Println("Hook triggered: BeforeCreate for InnerStructB")
    // ...
    return nil
}

// This works!
func (o *OuterStruct) BeforeCreate(tx *gorm.DB) error {
    fmt.Println("Hook triggered: BeforeCreate for OuterStruct")
    o.InnerStructA.A = uuid.New().String()
    o.InnerStructB.B = uuid.New().String()
    return nil
}

type OuterStruct struct {
    InnerStructA
    InnerStructB
    ID string `gorm:"type:varchar(40);not null"`
}
登入後複製

以上是有沒有辦法為結構內的每個結構執行 BeforeCreate 和 BeforeUpdate 掛鉤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板