beego orm 多对多查询

栏目: Go · 发布时间: 5年前

内容简介:实际上在这里卡了一天,后来还是在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",
        },
    ]
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员的算法趣题

程序员的算法趣题

[ 日] 增井敏克 / 绝 云 / 人民邮电出版社 / 2017-7 / 55.00元

本书是一本解谜式的趣味算法书,从实际应用出发,通过趣味谜题的解谜过程,引导读者在愉悦中提升思维能力、掌握算法精髓。此外,本书作者在谜题解答上,通过算法的关键原理讲解,从思维细节入手,发掘启发性算法新解,并辅以Ruby、JavaScript等不同语言编写的源代码示例,使读者在算法思维与编程实践的分合之间,切实提高编程能力。 本书适合已经学习过排序、搜索等知名算法,并想要学习更多有趣算法以提升编程技巧......一起来看看 《程序员的算法趣题》 这本书的介绍吧!

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具