gorm实现多对多关联

假设想实现的是文章(Article)和标签(Tag)之间的多对多关系。在 GORM 中,多对多关联可以通过在关联字段上使用 gorm:"many2many:<join_table_name>" 标记来实现。

下面是一个正确的示例:

  1. // Tag 表示标签,每个标签可以关联多篇文章。
  2. type Tag struct {
  3. gorm.Model
  4. Name string // 可选的标签名称
  5. Articles []Article `gorm:"many2many:article_tags;"` // 指定关联的多对多关系
  6. }
  7. // Article 表示文章,每篇文章可以有多个标签。
  8. type Article struct {
  9. gorm.Model
  10. Title string // 文章标题
  11. Content string // 文章内容
  12. Tags []Tag `gorm:"many2many:article_tags;"` // 指定关联的多对多关系
  13. }

说明

  1. 多对多关系标记
    TagArticle 结构体中,都使用了 gorm:"many2many:article_tags;" 标记。这告诉 GORM:

    • 这两个表之间存在多对多关系。
    • 关联关系使用的中间表命名为 article_tags。如果不指定,GORM 会根据一定规则生成。
  2. 自动管理中间表
    使用上述标记后,GORM 在执行自动迁移(AutoMigrate)时会自动创建中间表 article_tags,其中包含两个外键字段(例如 article_idtag_id)。

这样就完成了文章和标签之间的多对多关联定义。

示例用法

下面是一个简单的示例,展示如何保存一篇文章及其标签:

  1. // 假设 db 是已经初始化的 *gorm.DB 实例
  2. // 创建标签
  3. tag1 := Tag{Name: "Golang"}
  4. tag2 := Tag{Name: "数据库"}
  5. // 创建文章并关联标签
  6. article := Article{
  7. Title: "使用 GORM 实现多对多关联",
  8. Content: "这里详细介绍如何使用 GORM 定义多对多关联关系。",
  9. Tags: []Tag{tag1, tag2},
  10. }
  11. // 保存文章(此时 GORM 会自动插入关联的标签以及中间表数据)
  12. if err := db.Create(&article).Error; err != nil {
  13. log.Fatal(err)
  14. }
添加新评论