Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann man eine Assoziation nur dann erstellen, wenn die Assoziation nicht existiert? (gorm)

Wie kann man eine Assoziation nur dann erstellen, wenn die Assoziation nicht existiert? (gorm)

WBOY
WBOYnach vorne
2024-02-09 11:15:28882Durchsuche

仅当关联不存在时如何创建关联? (戈尔姆)

php-Editor Strawberry erklärt Ihnen, wie Sie eine Assoziation erstellen, wenn die Assoziation nicht existiert. Beim Programmieren müssen wir häufig assoziative Arrays verwenden, um Daten zu speichern und zu bearbeiten. Aber manchmal müssen wir eine neue Assoziation im assoziativen Array erstellen, aber wir wollen die bestehende Assoziation nicht überschreiben. Zu diesem Zeitpunkt können wir dies mithilfe einer bedingten Beurteilung erreichen und nur dann eine neue Assoziation erstellen, wenn die Assoziation nicht vorhanden ist. Diese Methode kann die Integrität und Genauigkeit von Daten sicherstellen und die Lesbarkeit und Wartbarkeit von Code verbessern. Werfen wir einen Blick auf die spezifische Implementierungsmethode.

Frageninhalt

Ich durchlaufe ein Array von Zeichenfolgen, um ein Dokument mit diesem Attribut zu erstellen (nur wenn das Attribut nicht vorhanden ist):

(dbi: meine Gorm-Datenbankinstanz)

var posttags []models.tag

for _, tagslug := range tagsarray {
    tag := models.tag{
        slug: tagslug,
    }

    err = dbi.where("slug = ?", tagslug).firstorcreate(&tag).error
    if err != nil {
            return c.status(fiber.statusinternalservererror).json(fiber.map{
                "error": "internal server error",
            })
    }
    posttags = append(posttags, tag)
}

Dann erstellen Sie einen Beitrag mit diesen Tags:

post := models.post{
       ...,
       tags: posttags 
}]

dbi.create(&post)

Modell:

type Post struct {
    BaseModel
    Title string `json:"title"`
    MarkdownUploadURL string `json:"markdownUploadUrl"` 
    AuthorID string `json:"authorId"`
    Tags []Tag `json:"tags" gorm:"many2many:posts_tags"`
}

type Tag struct {
    BaseModel
    Slug string `json:"slug"`
}

Ich habe versucht: konvertieren dbi.firstorcreate() 更改为 dbi.first() ,然后检查 errors.is(err, gorm.errrecordnotfound

Aber jedes Mal, wenn ich die Funktion aufrufe, erhalte ich andere Tags mit unterschiedlichen IDs, obwohl sie bereits in der Datenbank vorhanden sind...

Workaround

Behoben. Anstatt Ihrem Beitrag ein Tag hinzuzufügen, gehen Sie wie folgt vor:

post := models.post{
       tags: posttags, 
}

dbi.create(&post)

Das habe ich getan:

post := models.Post {
        // Other fields (AuthorID, MarkdownUploadURL, Title)
}

dbi.Create(&post)

dbi.Model(&post).Omit("Tags.*").Association("Tags").Append(postTags)

Referenz: https://github.com/go-gorm/gorm/issues/3605

Das obige ist der detaillierte Inhalt vonWie kann man eine Assoziation nur dann erstellen, wenn die Assoziation nicht existiert? (gorm). 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