背景:最近在學習 golang
,嘗試將以前的 PHP
項目用 go
改寫一下。
涉及的表模型以下三個:html
// 文章 type Topics struct { Id int `gorm:"primary_key"` Title string `gorm:"not null"` Body string `gorm:"not null"` UserId int `gorm:"not null"` CategoryId int `gorm:"not null"` Status int `gorm:"default:1"` CreatedAt time.Time UpdatedAt time.Time Category Categories `gorm:"foreignkey:CategoryId"` User Users `gorm:"foreignkey:UserId"` } // 用戶 type Users struct { Id int `gorm:"primary_key"` Name string `gorm:"not null"` Email string `gorm:"not null"` Password string `gorm:"not null"` Avatar string CreatedAt time.Time UpdatedAt time.Time LastActivedAt time.Time } // 分類 type Categories struct { Id int `gorm:"primary_key"` Name string `gorm:"not null"` Description string `gorm:"not null"` PostCount int CreatedAt time.Time UpdatedAt time.Time }
首先找到 gorm
官方文檔的相關介紹:
http://doc.gorm.io/associatio...
golang
躍躍欲試(code V1):bash
func (Topics) TopicByID(id int) (*Topics, error) { db := DB() defer db.Close() var topic Topics // 1. //result := db.Model(&topic).Where("id=?", id).Related(&topic.User) //2. //db.Where("id=?", id).First(&topic) //result := db.Model(&topic).Related(&topic.User) if err := result.Error; err != nil { return &topic, err } if result.RecordNotFound() == true { return &topic, utils.Error("文章不存在!") } return &topic, nil }
代碼中的兩種形式基本上是我再百度以後找到的結果。嘗試了一番,都報錯:(invalid association []
)。
而後在考慮是否個人外鍵定義的有問題:學習
(也沒問題)測試
繼續百度,找到 gorm的關聯問題。其中:
spa
這裏 Reload方法加了第二個參數,因而查看gorm關於這個方法的介紹:
3d
能夠加對應的外鍵參數,測試成功。code
最終代碼(code V2):orm
func (Topics) TopicByID(id int) (*Topics, error) { db := DB() defer db.Close() var topic Topics db.Where("id=?", id).First(&topic) // 關聯的關鍵代碼 db.Model(&topic).Related(&topic.Category, "CategoryId") result := db.Model(&topic).Related(&topic.User, "UserId") //result := db.Where("id=?", id).Preload("Category").Preload("User").First(&topic) if err := result.Error; err != nil { return &topic, err } if result.RecordNotFound() == true { return &topic, utils.Error("文章不存在!") } return &topic, nil }
注:註釋部分的 Preload
方法感受更加方便簡潔。htm
輸出結果: // 包含了文章內容,文章對應用戶信息,以及文章分類信息
{ 6 測試話題2 <p>who are you?</p> 1 3 0 0 0 0 1 2018-09-11 14:30:39 +0800 CST 2018-09-11 14:43:44 +0800 CST {3 問答 請保持友善,互幫互助 0 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC} {1 aurora test@mail.com 3ffd3de33d3c8bf09bf835d8f7f9b0e0 http://local.beego.com/static/upload/2018/09/07/deepin-cc.png 啦啦啦啦啦~嗝 b506cf029de29c626a1a27bc4d70f5b0 0 2018-08-28 15:56:39 +0800 CST 2018-09-07 14:32:46 +0800 CST 0001-01-01 00:00:00 +0000 UTC} }
總結:
以前文章的恢復,內容還沒來得及整理,將就看下吧