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

WBOY
Freigeben: 2024-02-09 11:15:28
nach vorne
902 Leute haben es durchsucht

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

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

Dann erstellen Sie einen Beitrag mit diesen Tags:

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

dbi.create(&post)
Nach dem Login kopieren

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

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

Das habe ich getan:

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

dbi.Create(&post)

dbi.Model(&post).Omit("Tags.*").Association("Tags").Append(postTags)
Nach dem Login kopieren

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!

Verwandte Etiketten:
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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!