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、Order和Product。
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