gorm / go 如何正确连接两个表?

     2023-03-29     20

关键词:

【中文标题】gorm / go 如何正确连接两个表?【英文标题】:gorm / go how to join two tables properly? 【发布时间】:2022-01-12 17:54:54 【问题描述】:

我的消息结构;

type Message struct 
  Id          int    `json:"id" gorm:"primaryKey;AUTO_INCREMENT"`
  Message     string `json:"message"`
  Sender      int    `json:"sender" gorm:"foreignKey:users"`
  ChatId      int    `json:"chatid" gorm:"index"`
  CreatedAt   int64  `json:"createdat" gorm:"autoCreateTime"`
  MessageType int    `json:"messagetype"` // 0 representing text , 1 representing image
  Image       string `json:"image"`       // will be empty if the image doesn't contain image

我的用户结构;

type User struct 
  ID                 int    `gorm:"primaryKey;AUTO_INCREMENT"`
  Username           string `gorm:"not null"`
  Mail               string `gorm:"not null"`
  Password           string `gorm:"not null"`
  Updated            int64  `gorm:"autoUpdateTime:milli"`
  Created            int64  `gorm:"autoCreateTime"`
  RegisterMethod     string `gorm:"not null"`
  IsEmailValidated   bool   `gorm:"default:false"`
  IsOnboardCompleted bool   `gorm:"default:false"`

这是我的查询;

messages := []model.Message
err := r.db.Joins("inner join users on messages.sender = users.id").Where("chat_id = ?", chatid).Order("created_at desc").Limit(10).Find(&messages).Error

这是结果;

 
    "id": 1,
    "message": "csacsacsa",
    "sender": 16,
    "chatid": 0,
    "createdat": 0,
    "messagetype": 0,
    "image": ""
,

我想要实现的是,使用“发件人”部分加入用户对象,例如


        "id": 1,
        "message": "csacsacsa",
        "sender": 
          "id":16,
          "username": "bla bla bla",
          "mail": "bla bla bla" 
          ....
        ,
        "chatid": 0,
        "createdat": 0,
        "messagetype": 0,
        "image": ""
,

【问题讨论】:

【参考方案1】:

您需要在 Message 结构中添加一个字段,以便为发件人提供所有信息。

消息结构更改:

type Message struct 
  Id          int    `json:"id" gorm:"primaryKey;AUTO_INCREMENT"`
  Message     string `json:"message"`
  Sender      int    `json:"senderid" gorm:"foreignKey:users"`
  SenderObj   User   `json:"sender" gorm:"foreignKey:ID;references:Sender"`
  ChatId      int    `json:"chatid" gorm:"index"`
  CreatedAt   int64  `json:"createdat" gorm:"autoCreateTime"`
  MessageType int    `json:"messagetype"` 
  Image       string `json:"image"`       

有了这个,你可以使用Preload函数来加载SenderObj字段。

messages := []model.Message
err := r.db.Preload("SenderObj").Where("chat_id = ?", chatid).Order("created_at desc").Limit(10).Find(&messages).Error

【讨论】:

非常感谢您的回答,选择一些特殊的栏目怎么样?现在它返回整个用户对象和一些不必要的数据,比如密码电子邮件,我想从用户中挑选一些部分,比如用户名和 id 您可以查看gorm.io/docs/preload.html#Custom-Preloading-SQL。我知道这个特定问题有一个 SO 答案(使用 Preload 函数和 Select 函数),我现在似乎找不到它。

Go GORM 有很多关系。如何将数据存储到MYSQL DB

】GoGORM有很多关系。如何将数据存储到MYSQLDB【英文标题】:GoGORMhasmanyrelationship.HowtostorethedatatoMYSQLDB【发布时间】:2021-12-2818:41:06【问题描述】:我是后端新手,也是golang和gorm的新手。我通过在go和gorm中使用has-many构建简单的api... 查看详情

gorm基本使用

参考技术Agorm安装gorm框架是go的一个数据库连接及交互框架,一般用于连接关系型数据库。安装gorm,使用命令安装:goget-u-vgithub.com/jinzhu/gorm连接数据库构建连接的目标为数据库中某一个库,同大多数框架一样使用url进行连接,ur... 查看详情

比较与特定字段有关的两个表之间的差异时如何正确连接

】比较与特定字段有关的两个表之间的差异时如何正确连接【英文标题】:Howtoproperlyjoinwhencomparingthedifferencebetweentwotablespertainingtospecificfields【发布时间】:2017-11-2719:22:38【问题描述】:我在编写此查询时遇到问题。所以我将一... 查看详情

如何在 Gorm 中留下连接子查询计数

】如何在Gorm中留下连接子查询计数【英文标题】:HowtoleftjoinsubquerycountinGorm【发布时间】:2021-12-1921:03:32【问题描述】:我希望我的Gorm查询返回正确的version_count。我的Gorm查询返回0version_count,而我的MySQL查询返回version_count。我... 查看详情

go-zero我是如何把gorm整合进go-zero的?(代码片段)

原创不易,未经允许,请勿转载。go-zero提供的代码生成器里面,没有提供orm框架操作,但是提供了遍历的缓存操作。但是gorm框架的话,没有比较好的缓存插件,虽然有一个gcache,但不支持gorm2.0版本。所以... 查看详情

初学go入门-案例-教程-记录(13)orm框架gorm简单案例-连接sqlserver,并查询数据(代码片段)

...go入门-案例-教程-记录(13)orm框架Gorm简单案例-连接sqlserver,并查询数据初安装依赖代码:结果附表结构表结构图表结构代码初希望能写一些简单的教程和案例分享给需要的人欢迎进qq群交流:546496965怎么使用... 查看详情

go项目中数据库连接,以及redis连接(代码片段)

 文件:common/mysql.go数据库连接文件packagecommonimport("gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/schema""log")varDB*gorm.DB//全局定义DBvardbErrerror//定义数据库错误funcinit()dsn:="root:root123456@tcp(127.0.0.1:3306)/godemo?charset=utf8"DB,dbErr=gorm.Open(mysql.Open... 查看详情

如何在 Go-Gorm 中禁用默认错误记录器

】如何在Go-Gorm中禁用默认错误记录器【英文标题】:HowtodisabledefaulterrorloggerinGo-Gorm【发布时间】:2019-09-1709:49:46【问题描述】:我在MySQL中使用GORM,我遇到并处理了错误Error1062:Duplicateentry。问题是它仍然打印到控制台。gym/models/... 查看详情

go-zero我是如何把gorm整合进go-zero的?(代码片段)

原创不易,未经允许,请勿转载。go-zero提供的代码生成器里面,没有提供orm框架操作,但是提供了遍历的缓存操作。但是gorm框架的话,没有比较好的缓存插件,虽然有一个gcache,但不支持gorm2.0版本。所以... 查看详情

go实战|电商平台数据库建表(代码片段)

文章目录写在前面1.初始化连接2.建立表3.迁移写在前面第一节,我们确定了ER图,数据字典。第二节,我们已经配置了MySQL。结合前两章,我们就可以建立数据库表了。1.初始化连接init.gopackagemodelimport( "github.com/... 查看详情

从java到go搭建go的orm框架gorm(代码片段)

【提问】如何使用Goland软件,搭建一个ORM框架GORM?【解答】具体步骤如下:1、检查Go的安装在任意目录执行如下命令:goversion若有如下返回,则安装成功;如果报异常,则重新安装golanggoversiongo1.19.1darw... 查看详情

如何正确输出连接表?

】如何正确输出连接表?【英文标题】:HowdoIoutputjoinedtablescorrectly?【发布时间】:2018-07-2515:19:34【问题描述】:我在\'user.ID\'=\'email.ID\'上使用两个带有内部联接的表。每个用户都有一个名字和一个ID。每封电子邮件都有一个用户... 查看详情

如何在两个表之间创建正确的联接?

】如何在两个表之间创建正确的联接?【英文标题】:HowTocreatecorrectJoinbetweentwotables?【发布时间】:2015-03-2410:20:01【问题描述】:我有两个表,我想从这两个表中获取数据。客户详情IdCustomer1Customer2112221313CustomerNameIdName1a2b3c输出... 查看详情

go语言使用gorm对mysql进行性能测试

...其中对gorm框架在操作MySQL的各种基础实践,下面分享一下如何使用gorm框架对MySQL直接进行性能测试的简单实践。这里我使用了一个原始的Go语言版本的FunTester测试框架,现在只有一个基本的方法,实在是因为Go语言特性太强了。... 查看详情

go开源宝藏gorm专场(含思维导图)|持续更新(代码片段)

...新哒思维导图目录写在前面思维导图1.简介2.数据库驱动3.连接(MySQL为例子)4.迁移(MySQL为例子)4.1构建数据库表4.2数据库模型迁移4.3tags束缚4.3.1 查看详情

gorm的简单使用(代码片段)

.../gorm.book.jasperxu.com/××官方文档安装goget-ugithub.com/jinzhu/gorm连接mysqlgorm连接mysql依赖mysql驱动,连接前需安装mysql驱动github.com/go-sql-driver/mysql单独连接示例packagedatabaseimport( _"github.com/go-sql-driver/mysql" "github.com/jinzhu/gorm" ... 查看详情

如何在没有重复数据的情况下对两个具有连接的表进行求和?

】如何在没有重复数据的情况下对两个具有连接的表进行求和?【英文标题】:HowcanISUMtwotableswithajoinwithoutduplicatedata?【发布时间】:2020-02-0209:54:28【问题描述】:我无法在两个表之间正确地求和,我不明白原因。如果有人帮助... 查看详情

如何覆盖 Grails GORM 中关系的级联删除?

】如何覆盖GrailsGORM中关系的级联删除?【英文标题】:HowdoIoverridethecascadedeleteforarelationinGrailsGORM?【发布时间】:2010-11-0906:54:34【问题描述】:我在使用Grails的GORM部分时遇到了一些问题。我正在使用Grails1.3.4和H2。在数据库中,... 查看详情