Maison  >  Article  >  développement back-end  >  Comment créer une association seulement si elle n'existe pas ? (gorme)

Comment créer une association seulement si elle n'existe pas ? (gorme)

WBOY
WBOYavant
2024-02-09 11:15:28923parcourir

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

l'éditeur php Fraise vous expliquera comment créer une association lorsque l'association n'existe pas. En programmation, nous devons souvent utiliser des tableaux associatifs pour stocker et manipuler des données. Mais parfois, nous devons créer une nouvelle association dans le tableau associatif, mais nous ne voulons pas écraser l'association existante. À ce stade, nous pouvons utiliser le jugement conditionnel pour y parvenir et créer une nouvelle association uniquement lorsque l'association n'existe pas. Cette méthode peut garantir l'intégrité et l'exactitude des données et améliorer la lisibilité et la maintenabilité du code. Jetons un coup d'œil à la méthode de mise en œuvre spécifique.

Contenu de la question

Je parcours un tableau de chaînes pour créer un document avec cette propriété (uniquement si la propriété n'existe pas) :

(dbi : mon instance de base de données gorm)

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)
}

Créez ensuite une publication en utilisant ces balises :

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

dbi.create(&post)

Modèle :

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

J'ai essayé : convertir dbi.firstorcreate() 更改为 dbi.first() ,然后检查 errors.is(err, gorm.errrecordnotfound

Mais chaque fois que j'appelle la fonction, j'obtiens différentes balises avec des identifiants différents, même si elles existent déjà dans la base de données...

Solution de contournement

Corrigé. Au lieu d'ajouter un tag à votre message, aimez ceci :

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

dbi.create(&post)

Voici ce que j'ai fait :

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

dbi.Create(&post)

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

Référence : https://github.com/go-gorm/gorm/issues/3605

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer