Heim >Backend-Entwicklung >Golang >Gibt es eine Möglichkeit, BeforeCreate- und BeforeUpdate-Hooks für jede Struktur innerhalb einer Struktur durchzuführen?

Gibt es eine Möglichkeit, BeforeCreate- und BeforeUpdate-Hooks für jede Struktur innerhalb einer Struktur durchzuführen?

PHPz
PHPznach vorne
2024-02-05 21:48:08867Durchsuche

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

Frageninhalt

Ich habe den folgenden Code:

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"`
}

Wenn ich einen Datensatz erstelle:

outerStructObject := OuterStruct{
        ID:          "sample_ID",
    }
err := db.Create(&outerStructObject).Error

Rufen Sie nur einen der beforecreate()-Hooks auf. Andere beforecreate werden übersprungen.

gorm-Version ist jinzhu/gorm v1.9.16

Gibt es eine Möglichkeit, beide Hooks aufzurufen, wenn die create-Anweisung aufgerufen wird?

Es wird erwartet, dass der Beforecreate-Hook für zwei innere Strukturen aufgerufen wird – innerstructa und innerstructb.


Richtige Antwort


Peters Kommentar ist korrekt, ich werde meine Tests und Kommentare hier teilen, aber die Verwendung des offiziellen Repositorys go -gorm/gorm und der neuesten Version v1.25.0 hat sehr ähnliche Ergebnisse und einige API-Änderungen.

Beim Erstellen einer externen Registry können die internen Objekte wie folgt festgelegt werden:

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
}

Um interne Objekt-Hooks auszulösen, können Sie diese nur direkt erstellen:

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

errcreateinner := db.create(&innera).error

Hier ist ein vollständiges Einzelbeispiel:

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"`
}

Das obige ist der detaillierte Inhalt vonGibt es eine Möglichkeit, BeforeCreate- und BeforeUpdate-Hooks für jede Struktur innerhalb einer Struktur durchzuführen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen