前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >beego中orm关联查询使用解析

beego中orm关联查询使用解析

作者头像
用户1141560
发布2017-12-26 11:39:48
2.5K0
发布2017-12-26 11:39:48
举报
文章被收录于专栏:西安-晁州西安-晁州

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

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

代码语言:javascript
复制
// 数据库别名
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定义

代码语言:javascript
复制
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、首先是根据用户查询所有文章

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

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

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

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

测试如下:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-09-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档