首先纠正一下beego的文档rel_table设置自动生成的 m2m 关系表的名称rel_through如果要在 m2m 关系中使用自定义的 m2m 关系表通过这个设置其名称,格式为 pkg.path.ModelNameeg: app.models.PostTagRelPostTagRel 表需要有到 Post 和 Tag 的关系实际上rel_through的格式并不是pkg.path.ModelName,正确的姿势是:// 不要照抄哈,这里只是eg应该怎么使用learnBeego/myApp/models.RoleUser在这里卡了一天,后来还是在google的帮助下找到了问题,bd能搜索出关于go的东西实在太少了举个例子需求:用户、角色。我们要实现 一个用户可以有多个角色,一个角色可以有多个用户数据表设计用户表 useridusernamepasswrodcreated_atupdated_at1testa1234562018-01-01 12:36:472018-01-01 12:36:472testb6543212018-01-01 12:36:472018-01-01 12:36:47角色表 roleidnamecreated_atupdated_at1测试角色A2018-01-01 12:36:472018-01-01 12:36:472测试角色B2018-01-01 12:36:472018-01-01 12:36:47角色用户关系表 role_useriduser_idrole_idcreated_atupdated_at1112018-01-01 12:36:472018-01-01 12:36:472122018-01-01 12:36:472018-01-01 12:36:473212018-01-01 12:36:472018-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”, }, ]}