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