orm框架之gorm的关联查询 | 青训营笔记

80 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

在开发大项目的过程中,我遇到了一个问题。

比如怎么在查询Video的时候,将User的数据也一并查询到,我首先就想到了先把视频查出来,再根据视频表里的user_id进行查询,但经过我查阅Gorm的官方文档,发现有个预加载的功能,可以实现我想要的功能。

db.Preload("User").Where("id=?", id).First(&video).Error

看起来是没有问题,但是当我想要的是特定的数据,就出问题了。 比如我只需要用户表中的id,用户名,粉丝和关注数量,并且要判断当前查询的用户是否关注该用户,关注为true,否则false。

但是因为我上面写的那种方式直接返回了所有数据,也没有我需要添加的一个是否关注的字段,那怎么办呢?

我首先想到的是for循环遍历数据,再把数据抽出来单独定义一个Response,然后感觉这个方案貌似不太好,我又开始查阅官方文档,看看是否有解决方案。

我找到了几种方法:

1、比如查询Preload里面是可以写一些操作,可以筛选出需要的字段,然后在使用Assign,给某个字段一个默认值,不管是否查询到,都使用该值,此方案我没尝试过,不确定是否能实现。

2、使用查询钩子AfterFind,在查询结束后对数据进行处理,这个也没试过,暂时记录下来,后面再回头看看是否能行。

3、使用for rows.Next() {},这是我用的方法,对查到的数据进行处理,官方文档给的示例:

rows, err := db.Model(&model.Video{}).Where("user_id = ?", userID).Rows()
defer rows.Close()
for rows.Next() {
    var video model.Video
    // ScanRows 方法用于将一行记录扫描至结构体
    db.ScanRows(rows, &video)
    // 然后就可以写自己需要处理的业务逻辑了
    ...
}

也不知道其他大家是怎么解决的,我自己在这里还是耽搁了一些时间,不过这期间翻看gorm的文档,也算是收获良多,最后,这个方案也许不怎么好,如果有大佬愿意指点一下的话感激不尽。