Beego脫坑(十五)ORM關係查詢


title: Beego脫坑(十五)ORM關係查詢
tags: go,beego,orm
author : Clown95


關係查詢

接下來我們將講解關係查詢,關係查詢分爲 一對多多對一多對多。爲了更好的演示這些關係我們先建立三個表,分別是CustomerOrderProduct

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("查詢成功!")
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章