Golang Go语言中gorm结构体中定义了关联关系,某些接口不需要时如何取消

发布于 1周前 作者 htzhanglong 来自 Go语言

Golang Go语言中gorm结构体中定义了关联关系,某些接口不需要时如何取消
某些接口不需要关联数据,在查询数据时如何取消,即不显示空的关联结构体?

12 回复

看看文档? 印象中有的

更多关于Golang Go语言中gorm结构体中定义了关联关系,某些接口不需要时如何取消的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


文档看过了,帮我研究下

是指接口返回数据中隐藏一些信息吗 ?


func handlerApiXXX(w httpResponseWriter,r *http.Request) {

var user model.User
//… get User

type T struct{
model.User

// 隐藏 password_hash, salt 信息
OmitPassword bool json:"password_hash,omitempty"
OmitSalt bool json:"salt,omitempty"
}

var t = T{User: user}
_ = json.NewEcode(w).Encode(t)
}

是这样的
type user struct {
ID int32
Name string

//关联账户
Account Account gorm:"foreignkey:UserId"
}

正常查询结果是有 Account 关联数据的,但是另一个接口 不需要 Account 的数据 ,我如何在不改变结构体关联关系而取消关联,(即不在查询结果中只显示 ID,Name;不显示 Account 数据结构)


是这样的
type user struct {

ID int32
Name string
//关联账户
Account Account gorm:"foreignkey:UserId"

}

type Account struct {

ID int32
UserId int32


}

正常查询结果是有 Account 关联数据的,但是另一个接口 不需要 Account 的数据 ,我如何在不改变结构体关联关系而取消关联,(即在查询结果中只显示 ID,Name;不显示 Account 数据结构)

type T struct {
Username string json:"username"

Password string json:"-"
}

type User struct {
ID int32
Name string
//关联账户
Account Account gorm:"foreignkey:UserId" json:"-" // json 结果将不包含 Account 信息
}

如果 User 是其他包的无法修改

就在输出时临时定义一个 struct,利用 omitempty 特性把空值移除
type T struct {
User
OmitAccount bool json:"Account,omitempty" // 只要这里是空值 false, json 输出将不会包含 Account
}

omitempty 可行,但是对于列表查询如何处理里面的 “ account ” 如:
var list []User

数据结构如下:
{
“data”:[
{
“id”: 1,
“name”:“name”,
“account”:{
“id”:0,
“mobile”:"",
“password”:""
}
},{
“id”: 2,
“name”:“names”,
“account”:{
“id”:0,
“mobile”:"",
“password”:""
}
},
]
}

循环一遍转成[]T 啊

转的地方多就包装一个新类型转

type Users []User
func (users Users) Convert() []T

//…
}

Users(users).Convert()

在Go语言的GORM框架中,当我们在结构体中定义了关联关系(如一对一、一对多、多对多等)后,有时候我们可能希望在特定的查询接口中不加载这些关联数据,以提高查询效率或简化数据处理。

要取消加载特定的关联关系,GORM提供了几种方法:

  1. 使用Preload方法的反向逻辑:虽然Preload方法用于预加载关联数据,但你可以通过不调用它来实现不加载关联数据。这是最直接的方法,只需在查询时不包含Preload调用即可。

  2. 使用Select方法指定字段:通过Select方法精确指定要查询的字段,排除关联字段。这样,GORM在生成SQL查询时会忽略未指定的关联数据。

  3. 关联模式的条件过滤:虽然这不是直接取消关联的方法,但你可以通过在Preload时添加条件(如Preload("关联名", "条件"))来限制加载的关联数据。如果条件为空或不可能满足,也可以间接达到不加载关联的效果。

  4. 使用Joins代替Preload:在需要更复杂查询控制时,可以使用Joins方法手动连接表,并精确控制要加载的字段和关联数据。

总的来说,最常用且推荐的方法是直接不在查询中使用Preload,以及通过Select方法精确指定查询字段。这样可以确保你的接口在不需要关联数据时保持高效和简洁。

回到顶部