zoukankan      html  css  js  c++  java
  • 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)
        }

    测试如下:

  • 相关阅读:
    Visual C++ 打印编程技术-内存设备环境
    MySQL存储引擎
    记录阿里云服务器docker安装wordpress
    记录dockerfile参数
    记录一次 在公网使用FRP内网穿透开源软件,通过SSH连接内网服务器
    记录一次docker安装zabbix5.0
    记录一次zabbix邮件告警搭建过程和问题处理
    记录一次yum-config-manager命令的使用
    记录一次解决zabbix5.0图形化界面文字乱码的问题
    记录一次查看本地端口10050被哪个IP地址访问
  • 原文地址:https://www.cnblogs.com/vipzhou/p/5893568.html
Copyright © 2011-2022 走看看