摘要:本节学习了对数据库的表关系“(一对一、一对多、多对多)、数据过滤参数
一、表关系
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{})

- 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)