Beego脫坑(十五)ORM關(guān)系查詢(xún)


title: Beego脫坑(十五)ORM關(guān)系查詢(xún)
tags: go,beego,orm
author : Clown95


關(guān)系查詢(xún)

接下來(lái)我們將講解關(guān)系查詢(xún),關(guān)系查詢(xún)分為 一對(duì)多、多對(duì)一多對(duì)多。為了更好的演示這些關(guān)系我們先建立三個(gè)表,分別是Customer、OrderProduct。

package controllers

import (
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/orm"
    _ "github.com/go-sql-driver/mysql"
)

type RelQueryController struct {
    beego.Controller
}

type Customer struct {
    Id int  `orm:"pk;auto""`
    UserName string
    Sex  string `orm:"size(5)"`
    Mobile string  `orm:"size(11)"`
    Order []*Order `orm:"reverse(many)"`  // one to many
}

type Order struct {
    Id int `orm:"pk;auto"`
    OrderData string
    Customer * Customer  `orm:"rel(fk)"` // 外鍵
    Products []*Product `orm:"rel(m2m)"`//many to many
}

type Product struct {
    Id int `orm:"pk;auto""`
    Name string
    Price float64
    Order []*Order `orm:"reverse(many)"`
}

func init(){
    //注冊(cè)數(shù)據(jù)驅(qū)動(dòng)
    orm.RegisterDriver("mysql", orm.DRMySQL)
    //注冊(cè)數(shù)據(jù)庫(kù) ORM 必須注冊(cè)一個(gè)別名為 default 的數(shù)據(jù)庫(kù),作為默認(rèn)使用
    orm.RegisterDataBase("default", "mysql", "root:yangjie@tcp(127.0.0.1:3306)/Shop?charset=utf8")
    //注冊(cè)模型
    orm.RegisterModel(new(Customer),new(Order),new(Product))
    //自動(dòng)創(chuàng)建表 參數(shù)二為是否開(kāi)啟創(chuàng)建表   參數(shù)三是否更新表
    orm.RunSyncdb("default", false, true)
}

我們成功創(chuàng)建了4個(gè)表

image

然后我們隨便插入些數(shù)據(jù)

image
image
image
image

一對(duì)多

// 一對(duì)多:通過(guò)用戶(hù)id查詢(xún)?cè)撚脩?hù)所有訂單
func (this * RelQueryController)GetO2M(){
    var orders []*Order
    orm := orm.NewOrm()
    n, err := orm.QueryTable("Order").Filter("Customer__Id", 2).All(&orders)
    if err != nil {
        this.Ctx.WriteString("查詢(xún)失敗")
        return
    }
    fmt.Println("n = ", n)
    for _, order := range orders {
        fmt.Println("order = ", order)

    }
    this.Ctx.WriteString("查詢(xún)成功")
}
image

多對(duì)一

//多對(duì)一:通過(guò)訂單id查詢(xún)出該訂單屬于哪個(gè)用戶(hù)
func (this *RelQueryController) GetM2O() {
    orm := orm.NewOrm()
    var customer Customer
    err := orm.QueryTable("customer").Filter("Order__Id", 3).One(&customer)
    if err != nil {
        this.Ctx.WriteString("查詢(xún)失敗!")
        return
    }
    fmt.Println("customer = ", customer)
    this.Ctx.WriteString("查詢(xún)成功!")
}
image

多對(duì)多

//多對(duì)多:通過(guò)訂單id查詢(xún)訂單中的商品
func (this *RelQueryController) GetM2M() {
    var products []*Product
    orm := orm.NewOrm()
    n, err := orm.QueryTable("product").Filter("order__order__Id", 1).All(&products)
    if err != nil {
        this.Ctx.WriteString("查詢(xún)出錯(cuò)!")
        return
    }
    fmt.Println("n = ", n)
    for _, product := range products {
        fmt.Println("product = ", product)
    }
    this.Ctx.WriteString("查詢(xún)成功!")
}
image
//多對(duì)多:通過(guò)商品id查詢(xún)?cè)撋唐穼儆谀切┯唵?func (this *RelQueryController) GetM2M1() {
    var orders []*Order
    orm := orm.NewOrm()
    n, err := orm.QueryTable("order").Filter("products__product__id", 3).All(&orders)
    if err != nil {
        this.Ctx.WriteString("查詢(xún)出錯(cuò)!")
        return
    }
    fmt.Println("n = ", n)
    for _, order := range orders {
        fmt.Println("order = ", order)
    }
    this.Ctx.WriteString("查詢(xún)成功!")
}

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容