type Tag struct { ID uint Name string Articles []Article `gorm:"many2many:article_tags;"`// 用于反向引用 } type Article struct { ID uint Title string Tags []Tag `gorm:"many2many:article_tags;"` }
// 创建文章的同时,创建tag;如果创建文章的时候关联tag,需要先查询出该tag通过切片方式传入 DB.Debug().Create(&Article{ Title: "golang学习", Tags: []Tag{ { Name: "go", }, { Name: "goo", }, }, }) // 执行sql如下 // INSERT INTO `tb_tag` (`name`) VALUES ('go'),('goo') ON DUPLICATE KEY UPDATE `id`=`id` // INSERT INTO `tb_article_tags` (`article_id`,`tag_id`) VALUES (1,1),(1,2) ON DUPLICATE KEY UPDATE `article_id`=`article_id` // INSERT INTO `tb_article` (`title`) VALUES ('golang学习')
1 2 3 4 5
var tag Tag DB.Take(&tag, "name = ?", "goo") tags := []Tag{tag, Tag{Name: "xxxx"}} DB.Create(&Article{Title: "python基础", Tags: tags}) // 同时添加新的tag和已经存在的tag 已经存在的tag需要先查询出来
3. 多对多的查询
1 2 3 4 5
var a Article DB.Debug().Preload("Tags").Take(&a) // SELECT * FROM `tb_article_tags` WHERE `tb_article_tags`.`article_id` = 1 // SELECT * FROM `tb_tag` WHERE `tb_tag`.`id` IN (1,2) // SELECT * FROM `tb_article` LIMIT 1
4. 多对多的更新
1 2 3 4 5 6 7 8 9
// 先删除原有的标签 var article Article DB.Preload("Tags").Take(&article, 1) DB.Model(&article).Association("Tags").Delete(article.Tags)
// 在添加新的标签 var tag Tag DB.Take(&tag, "1") DB.Model(&article).Association("Tags").Append(&tag)
1 2 3 4 5 6
// 直接替换标签 需要同时查询出w文章表和 var article Article DB.Preload("Tags").Take(&article, 1) var tag Tag DB.Take(&tag, "3") DB.Model(&article).Association("Tags").Replace(&tag)
type Tag struct { ID uint Name string //Articles []Article `gorm:"many2many:article_tags;"` // 用于反向引用 } type Article struct { ID uint Title string Tags []Tag `gorm:"many2many:article_tags;"` }
type ArticleModel struct { ID uint Title string Tags []TagModel `gorm:"many2many:article_tags;joinForeignKey:ArticleID;JoinReferences:TagID"` }
type TagModel struct { ID uint Name string Articles []ArticleModel `gorm:"many2many:article_tags;joinForeignKey:TagID;JoinReferences:ArticleID"`// 用于反向引用 }