beego中orm關聯查詢使用解析


這兩天在學習beego框架,之前學習的時候遺漏了很多東西,比如orm、緩存、應用監控、模板處理等,這里將通過實例記錄下如何使用beego自帶的orm進行關聯查詢操作。

首先說明下,beego的orm有自動建表的功能,使用方法呢如下:

// 數據庫別名
name := "default"

// drop table 后再建表
force := true

// 打印執行過程
verbose := true

// 遇到錯誤立即返回
err := orm.RunSyncdb(name, force, verbose)
if err != nil {
    fmt.Println(err)
}

不過我們這里不使用自動建表,而是使用pd設計好之后生成對應的sql文件,先看下數據庫表關系設置:

主要關系是:

會員(用戶) -> 文章:一對多

文章 -> 文章分類:多對一

文章 -> 評論:一對多

說明:beego的orm使用時,外鍵id在關聯查詢時會默認添加一個"_id"結尾,比如:文章表對應的作者id,orm在關聯查詢時會默認查詢xxx_id,其中xxx為struct中定義的json字段全稱,這樣的話最好定義外鍵id時直接寫成xxx_id形式,然后struct的字段的json tag寫成xxx即可。

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)"`
}

數據庫數據如下:

文章表數據

文章分類表數據

會員表

關聯查詢

首先是一對多關聯查詢:

1、首先是根據用戶查詢所有文章

var articles []*models.Article
    orm.NewOrm().QueryTable("article").Filter("User", 1).RelatedSel().All(&articles)
    for _, v := range articles {
        fmt.Println(v.Id)
    }

測試如下,打印的sql及結果:

2、根據文章查詢對應用戶

var user models.User
    err := orm.NewOrm().QueryTable("user").Filter("Name", "張三").Limit(1).One(&user)
    if err == nil {
        fmt.Println(user)
    }

測試如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM