title: Beego脫坑(十五)ORM關係查詢
tags: go,beego,orm
author : Clown95
關係查詢
接下來我們將講解關係查詢,關係查詢分爲 一對多
、多對一
和多對多
。爲了更好的演示這些關係我們先建立三個表,分別是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(){
//註冊數據驅動
orm.RegisterDriver("mysql", orm.DRMySQL)
//註冊數據庫 ORM 必須註冊一個別名爲 default 的數據庫,作爲默認使用
orm.RegisterDataBase("default", "mysql", "root:yangjie@tcp(127.0.0.1:3306)/Shop?charset=utf8")
//註冊模型
orm.RegisterModel(new(Customer),new(Order),new(Product))
//自動創建表 參數二爲是否開啓創建表 參數三是否更新表
orm.RunSyncdb("default", false, true)
}
我們成功創建了4個表
然後我們隨便插入些數據
一對多
// 一對多:通過用戶id查詢該用戶所有訂單
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("查詢失敗")
return
}
fmt.Println("n = ", n)
for _, order := range orders {
fmt.Println("order = ", order)
}
this.Ctx.WriteString("查詢成功")
}
多對一
//多對一:通過訂單id查詢出該訂單屬於哪個用戶
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("查詢失敗!")
return
}
fmt.Println("customer = ", customer)
this.Ctx.WriteString("查詢成功!")
}
多對多
//多對多:通過訂單id查詢訂單中的商品
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("查詢出錯!")
return
}
fmt.Println("n = ", n)
for _, product := range products {
fmt.Println("product = ", product)
}
this.Ctx.WriteString("查詢成功!")
}
//多對多:通過商品id查詢該商品屬於那些訂單
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("查詢出錯!")
return
}
fmt.Println("n = ", n)
for _, order := range orders {
fmt.Println("order = ", order)
}
this.Ctx.WriteString("查詢成功!")
}