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

PHPz
Freigeben: 2024-02-05 21:48:08
nach vorne
861 Leute haben es durchsucht

有没有办法为结构内的每个结构执行 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"`
}
Nach dem Login kopieren

Wenn ich einen Datensatz erstelle:

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

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
}
Nach dem Login kopieren

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

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

errcreateinner := db.create(&innera).error
Nach dem Login kopieren

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"`
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage