专栏首页hotqin888的专栏gorm jion查询映射(扫描scan)到新的结构体,必须使用select规定字段,与xorm的jion对比

gorm jion查询映射(扫描scan)到新的结构体,必须使用select规定字段,与xorm的jion对比

https://blog.csdn.net/f95_sljz/article/details/103687308

gorm的文档对于我来讲比较难看懂,因为一直使用beego嘛。

文档对于返回值没有说,要加.Error才是返回错误

这个jion是非常好用的,如果不用jion,就要将查出来的结果,循环,赋给新的结构体,写法很不优雅。

而xorm的这种操作不需要select字段。

如下是xorm的jion:

type OnlyOfficeAttach struct {
	OnlyOffice     `xorm:"extends"`
	OnlyAttachment `xorm:"extends"`
	User           `xorm:"extends"`
}

//分页取得所有项目
func GetDocList(offset, limit int) (docs []*OnlyOfficeAttach, err error) {
	engine.Table("OnlyOffice").Join("INNER", "user", "user.id = onlyoffice.uid").
		Join("INNER", "OnlyAttachment", "OnlyAttachment.id = onlyoffice.id").Limit(limit, offset).
		Find(&docs)
	return docs, err
}

如下是gorm的jion: 而且下列代码中,product表还可以再查project表,project表已经和最开始的cart表没有关系了。也就是表A——表B——表C,表A和表C没有关系,通过表B可以查表C。这种关联很厉害。

gorm必须使用select将要查的字段映射,否则返回不了值。

而且,这种关联,不需要什么外键啊,关联啊啥的,奇怪。jion和关联是什么关系?

//购物车表
type UserCart struct {
	Id int64 `json:"id"`
	UserId int64 `json:"userid"`
	Status          int    `json:"status"`
	UserNickname    string `json:"usernickname"`
	ProductTitle    string `json:"producttitle"`
	ProjectTitle    string `json:"projecttitle"`
	TopProjectTitle string `json:"topprojecttitle"`
}

//查询某个用户借阅记录
func GetUserCart(uid int64, limit, offset, status int) (usercarts []UserCart, err error) {
	//获取DB
	db := GetDB()
	// 必须要写权select,坑爹啊
	err = db.Table("cart").Select("cart.id,cart.user_id,cart.status,user.nickname as user_nickname, product.title as product_title, project.title as project_title, topproject.title as topproject_title").Where("user_id=?", uid).
		Joins("left JOIN user on user.id = cart.user_id").
		Joins("left join product on product.id = cart.product_id").
		Joins("left join project on project.id = product.project_id").
		Joins("left join project on project.id = product.top_project_id").
		Limit(limit).Offset(offset).Scan(&usercarts).Error
	return usercarts, err
}

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于gorm多表联合查询(left join)的小记

    Golang很流行,但是有些方面资料很少而且不详实,譬如:gorm的联合查询,当然,也不推荐复杂语句使用orm模型。

    hotqin888
  • SQL知识点总结

    我觉得对于SQL语句,清楚知道它执行的顺序,对于写sql语句非常重要                

    用户2192970
  • Go 每日一库之 xorm

    Go 标准库提供的数据库接口database/sql比较底层,使用它来操作数据库非常繁琐,而且容易出错。因而社区开源了不少第三方库,如上一篇文章中的sqlc工具...

    用户7731323
  • 一例 Hive join 优化实战

    由于 hive 与传统关系型数据库面对的业务场景及底层技术架构都有着很大差异,因此,传统数据库领域的一些技能放到 Hive 中可能已不再适用。关于 hive ...

    用户1177713
  • Gorm 使用

    使用 ORM 工具,通常需要在代码中定义模型(Models)与数据库中的数据表进行映射, 在 GORM 中模型(Models)通常是正常的结构体、基本的 go...

    王小明_HIT
  • Hbase的快速使用

    HBase是基于HDFS之上的,也可以采用存储本地模式,HBase是分布式数据库,将数据分为多份,同时是面向列的数据库,是bigtable的实现。

    黑白格
  • Go组件学习——gorm四步带你搞定DB增删改查

      Object-Relationl Mapping, 它的作用是映射数据库和对象之间的关系,方便我们在实现数据库操作的时候不用去写复杂的sql语句,把对数据库...

    JackieZheng
  • MySQL查询优化

         一个好的web应用,最重要的一点是有着优秀的访问性能。数据库MySQL是web应用的组成部分,也是决定其性能的重要部分。所以提升MySQL的性能至关重...

    那一叶随风
  • Go开源ORM——GORM

    可以通过定义嵌套gorm.Model这个结构体的类型来定义实体类,gorm.Model中定义了数据库表的一些常用基本字段

    歪歪梯
  • go web开发 (gin&gorm) 之DB配置及DAO的基本使用

      在正式进入主题前,先说说框架的现状,个人用的是gin-gonic框架,这是个在校大学生写的基于go语言的高性能web框架,在此之前我对比过beego 、 i...

    上帝
  • Siren Federate - Elasticsearch (join)增强插件初探

    最近在Elastic官网blog的这篇文章引起了许多人的注意——Investigative analysis of disjointed data in Ela...

    点火三周
  • Python之数据规整化:清理、转换、合并、重塑

    Python之数据规整化:清理、转换、合并、重塑 1. 合并数据集 pandas.merge可根据一个或者多个不同DataFrame中的行连接起来。 panda...

    王小雷
  • Apache Phoenix系列 | 真 · 从入门到精通

    文章简介:Phoenix是一个开源的HBASE SQL层。它不仅可以使用标准的JDBC API替代HBASE client API创建表,插入和查询HBASE,...

    王知无-import_bigdata
  • gorm查询嵌套结构体,嵌套预加载preload,关联,外键foreignkey,引用references

    一直想用gorm查询到嵌套结构体,可惜自定义嵌套结构体好像不支持?下次按这个思路再试试,可能也行哦。

    hotqin888
  • PHP+MySQL专家编程——MySQL联接

    我们通常会在SELECT语句中使用联接,MySQL查询的联接使我们能够利用一个SQL语句查询或操作多个表的数据。

    Hi胡瀚
  • PostgreSql的Explain命令详解

    PostgreSQL为每个收到的查询设计一个查询规划。选择正确的匹配查询结构和数据属性的规划对执行效率是至关重要要的,所以系统包含一个复杂的规划器来试图选择好的...

    hbbliyong
  • MySQL

      #mysqladmin -u root password "new_password";

    yaohong
  • FAQ系列之Phoenix

    是的。Apache Phoenix 用于 OLTP(在线事务处理)用例,而不是 OLAP(在线分析处理)用例。不过,您可以将 Phoenix 用于实时数据摄取作...

    大数据杂货铺
  • Apache-Flink深度解析-JOIN-LATERAL

    本篇介绍一个特殊的JOIN,那就是JOIN LATERAL。JOIN LATERAL为什么特殊呢,直观说因为JOIN的右边不是一个实际的物理表,而是一个VIEW...

    王知无-import_bigdata

扫码关注云+社区

领取腾讯云代金券