内容简介:实际上在这里卡了一天,后来还是在google的帮助下找到了问题,bd能搜索出关于go的东西实在太少了需求:用户、角色。
首先纠正一下beego的文档
rel_table
设置自动生成的 m2m 关系表的名称
rel_through
如果要在 m2m 关系中使用自定义的 m2m 关系表
通过这个设置其名称,格式为 pkg.path.ModelName
eg: app.models.PostTagRel
PostTagRel 表需要有到 Post 和 Tag 的关系
实际上 rel_through
的格式并不是 pkg.path.ModelName
,正确的姿势是:
// 不要照抄哈,这里只是eg应该怎么使用 learnBeego/myApp/models.RoleUser
在这里卡了一天,后来还是在google的帮助下找到了问题,bd能搜索出关于 go 的东西实在太少了
举个例子
需求:用户、角色。
我们要实现 一个用户可以有多个角色,一个角色可以有多个用户
数据表设计
用户表 user
| id | username | passwrod | created_at | updated_at |
|---|---|---|---|---|
| 1 | testa | 123456 | 2018-01-01 12:36:47 | 2018-01-01 12:36:47 |
| 2 | testb | 654321 | 2018-01-01 12:36:47 | 2018-01-01 12:36:47 |
角色表 role
| id | name | created_at | updated_at |
|---|---|---|---|
| 1 | 测试角色A | 2018-01-01 12:36:47 | 2018-01-01 12:36:47 |
| 2 | 测试角色B | 2018-01-01 12:36:47 | 2018-01-01 12:36:47 |
角色用户关系表 role_user
| id | user_id | role_id | created_at | updated_at |
|---|---|---|---|---|
| 1 | 1 | 1 | 2018-01-01 12:36:47 | 2018-01-01 12:36:47 |
| 2 | 1 | 2 | 2018-01-01 12:36:47 | 2018-01-01 12:36:47 |
| 3 | 2 | 1 | 2018-01-01 12:36:47 | 2018-01-01 12:36:47 |
模型
用户模型
注意!
使用多对多时,想要获取关系字段是需要手动完成的,orm不会为你自动完成这些查询操作,不要以为设置完 rel_through
就完事了!
type User struct {
Id int64
Username string `orm:"size(128);unique" valid:"Required"`
password string `orm:"size(128);" json:"-" valid:"Required"`
CreatedAt time.Time `orm:"auto_now_add;type(datetime)"`
UpdatedAt time.Time `orm:"auto_now;type(datetime)"`
Roles []*Role `orm:"rel(m2m);rel_through(learnBeego/myApp/models.RoleUser)"`
}
func init() {
orm.RegisterModel(new(User))
}
func (m *User) TableName() string {
return "user"
}
// 通过用户ID获取用户信息及用户所属的角色
func GetUserById(id int64) (v *User, err error) {
o := orm.NewOrm()
v = &User{Id: id}
if err = o.QueryTable(new(User)).Filter("Id",id).RelatedSel().One(v); err == nil {
// 获取关系字段,o.LoadRelated(v, "Roles") 这是关键
// 查找该用户所属的角色
if _, err = o.LoadRelated(v, "Roles");err!=nil{
return nil, err
}
return v, nil
}
return nil, err
}
角色模型
type Role struct {
Id int64
Name string
CreatedAt time.Time `orm:"auto_now_add;type(datetime)"`
UpdatedAt time.Time `orm:"auto_now;type(datetime)"`
Users []*User `orm:"reverse(many)"`
}
func init() {
orm.RegisterModel(new(Role))
}
func (m *Role) TableName() string {
return "role"
}
用户角色关系模型
type RoleUser struct {
Id int64
User *User `orm:"rel(fk)"`
Role *Role `orm:"rel(fk)"`
CreatedAt time.Time `orm:"type(datetime)"`
UpdatedAt time.Time `orm:"type(datetime)"`
}
func init() {
orm.RegisterModel(new(RoleUser))
}
func (m *RoleUser) TableName() string {
return "role_user"
}
最后在控制器中
...
func (c *UserController) GetOne() {
idStr := c.Ctx.Input.Param(":id")
id, _ := strconv.ParseInt(idStr, 0, 64)
v, err := models.GetUserById(id)
if err != nil {
c.Data["json"] = "找不到匹配的数据"
} else {
c.Data["json"] = v
}
c.ServeJSON()
}
...
最后,测试
假如 GetOne()
对应的URL是 localhost:8080/v1/user/:id
请求 http://localhost"8080/v1/user/1
时,返回的数据
{
"Id": 1,
"Username": "testa",
"CreatedAt": "2018-01-01T12:36:47+08:00",
"UpdatedAt": "2018-01-01T12:36:47+08:00",
"Roles":[
{
"Id": 1,
"Name": "测试角色A",
"CreatedAt": "2018-01-01T12:36:47+08:00",
"UpdatedAt": "2018-01-01T12:36:47+08:00",
},
{
"Id": 2,
"Name": "测试角色B",
"CreatedAt": "2018-01-01T12:36:47+08:00",
"UpdatedAt": "2018-01-01T12:36:47+08:00",
},
]
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Mybatis关联查询(嵌套查询)
- MySQL高级查询---连接查询实例
- Oracle子查询相关内容(包含TOP-N查询和分页查询)
- Laravel Query Builder 复杂查询案例:子查询实现分区查询 partition by
- 打造出色查询:如何优化SQL查询?
- SQL优化-慢查询+explain查询
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
应用密码学:协议、算法与C源程序(原书第2版)
(美)Bruce Schneier / 吴世忠、祝世雄、张文政 等 / 机械工业出版社 / 2014-1 / 79.00
......我所读过的关于密码学最好的书......该书是美国国家安全局最不愿意见到出版的书...... —— 《Wired》 ......不朽的......令人着迷的......计算机程序员必读的密码学上决定性的著作...... —— 《Dr.Dobb's Journal》 ......该领域勿庸置疑的一本权威之作。 —— 《PC Magazine》 ..........一起来看看 《应用密码学:协议、算法与C源程序(原书第2版)》 这本书的介绍吧!