要實現的功能.
文章屬於一個分類.
文章有多個標籤
相關表四張.表提前在資料庫建立的.沒有外來鍵關係
- 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"
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方法,直接如上面的查詢方式就可以了,查出來的結果如下
以上內容如有錯誤,或者你們有不懂的地方歡迎隨時交流.一起進步