gorm 關係一對一,一對多,多對多查詢

程式碼的壞味道發表於2019-12-30

要實現的功能.
文章屬於一個分類.
文章有多個標籤

相關表四張.表提前在資料庫建立的.沒有外來鍵關係

  • article表
  • tag表.
  • article_tag表
  • category表
//文章表
type Article struct {
  Id int `json:"id"`
  Title string `json:"title"`
  CategoryId int `json:"category_id"`
  Category Category `json:"category";gorm:"foreignkey:CategoryID"`//指定關聯外來鍵
  Tag []Tag `gorm:"many2many:article_tag" json:"tag"`//多對多關係.
  //article_tag表預設article_id欄位對應article表id.tag_id欄位對應tag表id
  //可以把對應sql日誌列印出來,便於除錯
}
//文章_標籤中間表
type ArticleTag struct {
   Id int `json:"id" `
  ArticleId string `json:"article_id"`
  TagId string `json:"tag_id"`
  CreatedAt string `json:"created_at"`
  UpdatedAt string `json:"updated_at"`
}
//標籤表
type Tag struct {
   Id int `json:"id" `
  TagName string `json:"tag_name"`
}
//分類表
type Category struct {
   ID int `json:"id"`
  CategoryName string `json:"category_name"`
  Status int `json:"status"`
  CreatedAt time.Time `json:"created_at"`
  UpdatedAt time.Time `json:"updated_at"`
}
//遠端一對多.一對一
func (a *Article) ListArticle(title string) (Article, error) {
   query := database.GormPool
  var article Article
  query.Where("title like ?", "%"+title+"%").First(&article)
   fmt.Println(article)
   err := query.Model(&article).
      Related(&article.Category).
      Related(&article.Tag, "tag").
      Find(&article).Error
  if err != nil && err != gorm.ErrRecordNotFound {
      return article, nil
  }
   return article, err
}

結果如圖:一個分類,多個標籤
使用 Related 方法, 需要先把 Article查詢好,
然後根據 Article 定義中指定的 CategoryID 去查詢 Category,
查詢標籤,就直接定義標籤接收陣列:然後寫gorm的表對應關係:"many2many:article_tag"
gorm 關係一對一,一對多,多對多查詢

func (a *Article) ListArticle(title string) (articles []Article, err error) {
    query := database.GormPool
    err = query.Model(articles).
        Where("title like ?", "%"+title+"%").
        Preload("Category").
        Preload("Tag").Find(&articles).Error
    if err != nil && err != gorm.ErrRecordNotFound {
        return
    }
    return
}

使用Preload方法,直接如上面的查詢方式就可以了,查出來的結果如下
gorm 關係一對一,一對多,多對多查詢
以上內容如有錯誤,或者你們有不懂的地方歡迎隨時交流.一起進步

cfun

相關文章