這兩天在學習beego框架,以前學習的時候遺漏了不少東西,好比orm、緩存、應用監控、模板處理等,這裏將經過實例記錄下如何使用beego自帶的orm進行關聯查詢操做。sql
首先說明下,beego的orm有自動建表的功能,使用方法呢以下:數據庫
// 數據庫別名 name := "default" // drop table 後再建表 force := true // 打印執行過程 verbose := true // 遇到錯誤當即返回 err := orm.RunSyncdb(name, force, verbose) if err != nil { fmt.Println(err) }
不過咱們這裏不使用自動建表,而是使用pd設計好以後生成對應的sql文件,先看下數據庫表關係設置:json
主要關係是:緩存
會員(用戶) -> 文章:一對多框架
文章 -> 文章分類:多對一學習
文章 -> 評論:一對多測試
說明:beego的orm使用時,外鍵id在關聯查詢時會默認添加一個"_id"結尾,好比:文章表對應的做者id,orm在關聯查詢時會默認查詢xxx_id,其中xxx爲struct中定義的json字段全稱,這樣的話最好定義外鍵id時直接寫成xxx_id形式,而後struct的字段的json tag寫成xxx便可。spa
struct定義設計
type User struct { Id int `json:"id"` Name string `json:"name"` Nickname string `json:"nickname"` Mobile string `json:"mobile"` Age int `json:"age"` Sex bool `json:"sex"` Email string `json:"email"` Address string `json:"address"` Pass string `json:"pass"` Addtime int `json:"addtime"` Lastlogin int `json:"lastlogin"` Articles []*Article `orm:"reverse(many)"` } type Article struct { Id int `json:"id"` Title string `json:"title"` Content string `json:"content"` Addtime int `json:"addtime"` Uptime int `json:"uptime"` User *User `json:"user" orm:"rel(fk)"` Link string `json:"link"` Intro string `json:"intro"` Type *Articletype `json:"type" orm:"rel(fk)"` Comments []*Comment `orm:"reverse(many)"` //反向一對多關聯 } type Articletype struct { Id int `json:"id"` Name string `json:"name"` Orderno int `json:"orderno"` Articles []*Article `orm:"reverse(many)"` } type Comment struct { Id int `json:"id"` Cname string `json:"cname"` Cemail string `json:"cemail"` Content string `json:"content"` Addtime int `json:"addtime"` Aid *Article `json:"article" orm:"rel(fk)"` }
數據庫數據以下:code
文章表數據
文章分類表數據
會員表
關聯查詢
首先是一對多關聯查詢:
一、首先是根據用戶查詢全部文章
var articles []*models.Article orm.NewOrm().QueryTable("article").Filter("User", 1).RelatedSel().All(&articles) for _, v := range articles { fmt.Println(v.Id) }
測試以下,打印的sql及結果:
二、根據文章查詢對應用戶
var user models.User err := orm.NewOrm().QueryTable("user").Filter("Name", "張三").Limit(1).One(&user) if err == nil { fmt.Println(user) }
測試以下: