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个表

image

然后我们随便插入些数据

image
image
image
image

一对多

// 一对多:通过用户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("查询成功")
}
image

多对一

//多对一:通过订单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("查询成功!")
}
image

多对多

//多对多:通过订单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("查询成功!")
}
image
//多对多:通过商品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("查询成功!")
}

image

你可能感兴趣的:(Beego脱坑(十五)ORM关系查询)