beego中orm关联查询使用解析

这两天在学习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)
    }

测试如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏非典型程序猿

Golang任务队列machinery使用与源码剖析(二)

在Golang任务队列machinery使用与源码剖析(一)一文中,我们主要对golang中任务队列machinery的设计结构以及具体模块的功能与源码实现进行...

3867
来自专栏MasiMaro 的技术博文

windows 多任务与进程

多任务的本质就是并行计算,它能够利用至少2处理器相互协调,同时计算同一个任务的不同部分,从而提高求解速度,或者求解单机无法求解的大规模问题。以前的分布式计算正是...

834
来自专栏battcn

一起来学SpringBoot | 第十八篇:轻松搞定全局异常

实际项目开发中,程序往往会发生各式各样的异常情况,特别是身为服务端开发人员的我们,总是不停的编写接口提供给前端调用,分工协作的情况下,避免不了异常的发生,如果直...

802
来自专栏Lambda

浅谈数据库主键策略

浅谈数据库主键策略 数据库表的主键很多童鞋都非常熟悉了,主键就是Primary Key,简称PK。 数据库主键的作用是唯一标识一条记录,所以在同一张表中,...

23810
来自专栏yang0range

深入探究Glide的缓存机制

Glide的缓存设计可以说是非常先进的,考虑的场景也很周全。在缓存这一功能上,Glide又将它分成了两个模块一个是内存缓存,一个是硬盘缓存。 这两个缓存模块的...

971
来自专栏Aox Lei

微信公众号信息抓取方法(二)——抓取文章点赞、阅读、评论、小程序信息

上一篇文章文章将cookie信息保存到redis中, 则这一节主要是取出cookie, 并且构造方法去获取文章的点赞、阅读、评论、小程序信息, 而且不会访问文章...

3754
来自专栏DOTNET

Entity Framework——性能测试

内容提要 一、对EF框架的性能测试 增、删、改,查测试及性能优化 二、使用sql执行 增、删、改,查测试 三、对以上两种方式对比分析 一 对EF框架的测试 1...

4756
来自专栏阿杜的世界

Redis学习札记

Redis支持两种持久化方式,一种是RDB方式(快照:根据指定的规则“定时”将内存中的数据存储在硬盘上),另一种是AOF方式(在每次执行命令后都将命令本身记录下...

883
来自专栏更流畅、简洁的软件开发方式

Step By Step 一步一步写网站[1] —— 填加数据(二)

(这个是我认真思考并精心写的,能不能算作高质量我就不敢说了) 建议先看一下第一篇: https://cloud.tencent.com/developer/a...

17610
来自专栏me的随笔

ASP.NET MVC5中View-Controller间数据的传递

使用ASP.NET MVC做开发时,经常需要在页面(View)和控制器(Controller)之间传递数据,那么都有哪些数据传递的方式呢?

701

扫码关注云+社区