通过使用gorm中的mysql库实现嵌套查询 | 青训营

73 阅读2分钟

在实现抖音大项目的发布列表查询时,我遇到一点问题,那就是:该怎么实现输出一个用户所发表的全部视频信息,而每一个的视频信息中又要含有用户信息呢?按照发布列表接口说明文档的要求,最终结果应该是一个video_list中包含全部视频的信息,如下代码所示

image.png 为了解决这个问题,我想到了在video结构体中增加一个字段,其值为user,可是直接这么放进去,又应该怎么查找对应的user信息呢? 为此,经过搜索,我找到了gorm查询中的关联查询,经过思考我认为这是一种belongs to关系。belongs to 会与另一个模型建立了一对一的连接。 这种模型的每一个实例都“属于”另一个模型的一个实例。因为每一个视频都属于一个作者,所以这正是一种belongs to关系,所以,我就修改了我的用户结构体定义和视频信息结构体定义。

image.png

image.png

在修改完两个结构体定义之后,就是该怎么查询的问题了,这时候就用到预加载了。什么是预加载呢? GORM允许使用 Preload通过多个SQL中来直接加载关系。在这种情况下,我们就可以根据video中的UserId检索对应用户的信息,接着填充进该video中的UserInfo,接着再打印出来就行。 具体的查询代码如下

UserID := id
var userVideos []model.Video
db.Preload("UserInfo").Where("user_id=?", UserID).Find(&userVideos)

这段代码什么意思呢?首先我们已经预先通过c.Query方法获得了用户的id,接着我们声明一个Video数组,最后就是查询这一步了。 Preload("UserInfo")即是说明要预加载该字段的值,where是gorm中的一个高级查找语句,我们要查找的UserInfo就是根据UserId进行查找的,所以我们就写Where("user_id=?", UserID),最后,我们将查找到的所有符合条件的视频信息返回到userVideos中,就完成了预加载查找。也就实现了大项目的查找功能。

以上就是整个嵌套查询的过程,主要参考了gorm的中文文档中的关联一章,如果读者还有不明白的地方,记得去看看噢!如果有什么写不明白的地方也欢迎来问我,谢谢!