摘要:本节学习了对数据库的表关系“(一对一、一对多、多对多)、数据过滤参数

一、表关系

1.一对一

type User struct{
    Profile *Prtofile `orm:"rel(one)"`  //设置Profile模型的主键为User模型的外键
}


type Profile struct{
    Id int `orm:"pk;auto"`
    Eyes string 
    Mouth string
    Ear string
    User *User `orm:"reverse(one)"` //反向关系,只是关系,没有外键
}

func init(){
    orm.RegisterModel(new(User))
    orm.RegisterModel(new(Profile))
}

完成代码后进行运行,查看数据库

可以发现在User表中新增了profile_id的字段,而关联表中并没有

2.一对多

  • article模型中:User *User `orm:"rel(fk)"` 正向关系,有外键,外键在多的一方
  • user模型中:Articles []*Articles `orm:"reverse(many)" 反向关系,没有外键

一对多,外键在多的一方

3.多对多

  • post模型中:Tags []*Tag `orm:"rel(m2m)"` 正向关系,没有外键
  • tag模型中:Posts []*Post `orm:"reverse(many)"` 反向关系,没有外键

二、数据查询表达式

//  models/chapter05/model.go
package chapter05

import (
	"github.com/astaxie/beego/orm"
	"time"
)

type User struct {
	Id int `orm:"pk;auto"`
	Name string `orm:"unique"`
	Age int //`orm:"column(user_age)"`
	Addr string `orm:"size(20)"`
	Money float64 `orm:"digits(12);decimals(2)"`
	Created time.Time `orm:"auto_now_add;type(datetime))"`
	Statue string `orm:"default(1);description(状态,1启用,2禁用)"`
	Profile *Profile `orm:"rel(one)"`
}

type Profile struct {
	Id int`orm:"pk;auto"`
	Eyes string
	Mouth string
	Ear string
	User *User `orm:"reverse(one)"`
}

//func (u *User) TableName() string {
//	return "User_Test_Table"
//}

func init()  {
	orm.RegisterModel(new(User))
	orm.RegisterModel(new(Profile))
}
//chapter05/QueryTable.go

package chapter05

import (
	"beeProject/models/chapter05"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
)

type QueryTableController struct {
	beego.Controller
}

func (q *QueryTableController) Get()  {
	o := orm.NewOrm()
	stu := chapter05.User{}
	qs := o.QueryTable(new(chapter05.User))
	qs.Filter("Age__exact",18).One(&stu)
	q.Data["msg"] = stu
	q.TplName = "chapter05/querytable.html"
}
//querytable.html
{{.msg}}
//router.go
beego.Router("/table",&chapter05.QueryTableController{})
  1. exact / iexact:等于,默认值,大小写敏感 / 不敏感
qs.Filter("name__exact","Zhiliao").One(&stu)

2. contains / icontains:包含,大小写敏感 / 不敏感

qs.Filter("name__contains","Zhil").One(&stu)

3. gt / gte:大于/大于等于

qs.Filter("age__gt",18).One(&stu)

4. lt / lte:小于/小于等于

qs.Filter("age__lt",18).One(&stu)

5. startswith / istartswith:以…起始,大小写敏感 / 不敏感

qs.Filter("name__startswith","Zh").One(&stu)
qs.Filter("name__istartswith","Zh").One(&stu)

6. endswith / iendswith:以…结束,大小写敏感 / 不敏感

qs.Filter("name__endswith","Liao").One(&stu)
qs.Filter("name__iendswith","Liao").One(&stu)

7. in:在某个范围中,值为不定长参数

qs.Filter("age__in",12,13,16,19).One(&stu)

8. isnull:为空,值为 true / false

qs.Filter("gender__isnull",true).One(&stu)