beego中orm关联查询使用解析
博客专区 > caiyezi 的博客 > 博客详情
beego中orm关联查询使用解析
caiyezi 发表于1年前
beego中orm关联查询使用解析
  • 发表于 1年前
  • 阅读 23
  • 收藏 1
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

这两天在学习beego框架,之前学习的时候遗漏了很多东西,比如orm、缓存、应用监控、模板处理等,这里将通过实例记录下如何使用beego自带的orm进行关联查询操作。

首先说明下,beego的orm有自动建表的功能,使用方法呢如下:

// 数据库别名
name := "default"

// drop table 后再建表
force := true

// 打印执行过程
verbose := true

// 遇到错误立即返回
err := orm.RunSyncdb(name, force, verbose) if err != nil { fmt.Println(err) }

不过我们这里不使用自动建表,而是使用pd设计好之后生成对应的sql文件,先看下数据库表关系设置:

主要关系是:

会员(用户) -> 文章:一对多

文章 -> 文章分类:多对一

文章 -> 评论:一对多

说明:beego的orm使用时,外键id在关联查询时会默认添加一个"_id"结尾,比如:文章表对应的作者id,orm在关联查询时会默认查询xxx_id,其中xxx为struct中定义的json字段全称,这样的话最好定义外键id时直接写成xxx_id形式,然后struct的字段的json tag写成xxx即可。

struct定义

type User struct { Id int        `json:"id"` Name string `json:"name"` Nickname string `json:"nickname"` Mobile string `json:"mobile"` Age int        `json:"age"` Sex bool `json:"sex"` Email string `json:"email"` Address string `json:"address"` Pass string `json:"pass"` Addtime int        `json:"addtime"` Lastlogin int        `json:"lastlogin"` Articles []*Article `orm:"reverse(many)"` } type Article struct { Id int          `json:"id"` Title string `json:"title"` Content string `json:"content"` Addtime int          `json:"addtime"` Uptime int          `json:"uptime"` User *User        `json:"user" orm:"rel(fk)"` Link string `json:"link"` Intro string `json:"intro"` Type *Articletype `json:"type" orm:"rel(fk)"` Comments []*Comment   `orm:"reverse(many)"` //反向一对多关联
} type Articletype struct { Id int        `json:"id"` Name string `json:"name"` Orderno int        `json:"orderno"` Articles []*Article `orm:"reverse(many)"` } type Comment struct { Id int      `json:"id"` Cname string `json:"cname"` Cemail string `json:"cemail"` Content string `json:"content"` Addtime int      `json:"addtime"` Aid *Article `json:"article" orm:"rel(fk)"` }

数据库数据如下:

文章表数据

文章分类表数据

会员表

关联查询

首先是一对多关联查询:

1、首先是根据用户查询所有文章

var articles []*models.Article orm.NewOrm().QueryTable("article").Filter("User", 1).RelatedSel().All(&articles) for _, v := range articles { fmt.Println(v.Id) }

测试如下,打印的sql及结果:

2、根据文章查询对应用户

var user models.User err := orm.NewOrm().QueryTable("user").Filter("Name", "张三").Limit(1).One(&user) if err == nil { fmt.Println(user) }

测试如下:

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 1
博文 108
码字总数 0
×
caiyezi
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: