package database import ( "gorm.io/gorm/clause" "strings" ) type Tag struct { ID int Name string } func ArticleTagsFromTagSlice(article Article, tags []Tag) (tagsTable []ArticleTags) { for _, tag := range tags { tagsTable = append(tagsTable, ArticleTags{ ArticleID: article.ID, TagID: tag.ID, }) } return } type ArticleTags struct { ArticleID int TagID int } func (db *Database) AddOrGetTags(names []string) (tags []Tag, err error) { for i, name := range names { names[i] = strings.ToLower(name) } err = db.gormDB.Table("tag").Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "name"}}, DoNothing: true, }).Select("name").Create(&names).Error if err != nil { return nil, err } err = db.gormDB.Table("tag").Find(&tags).Where("name in (?)", &names).Error return } func (db *Database) SetTags(article Article, tags []Tag) error { return db.gormDB.Table("tags").Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "article_id"}, {Name: "tag_id"}}, DoNothing: true, }).Create(ArticleTagsFromTagSlice(article, tags)).Error } func (db *Database) RemoveTags(article Article, tags []Tag) error { return db.gormDB.Table("tags").Delete(ArticleTagsFromTagSlice(article, tags)).Error }