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

2019-07-11 20:00:47 +08:00
 jss
某些接口不需要关联数据,在查询数据时如何取消,即不显示空的关联结构体?
3083 次点击
所在节点    Go 编程语言
11 条回复
janxin
2019-07-11 20:25:49 +08:00
看看文档? 印象中有的
jss
2019-07-11 20:35:09 +08:00
@janxin 文档看过了,帮我研究下
pubby
2019-07-11 21:11:02 +08:00
是指接口返回数据中隐藏一些信息吗 ?


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)
}
jss
2019-07-11 21:27:42 +08:00
@pubby 是这样的
type user struct {
ID int32
Name string

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

正常查询结果是有 Account 关联数据的,但是另一个接口 不需要 Account 的数据 ,我如何在不改变结构体关联关系而取消关联,(即不在查询结果中只显示 ID,Name;不显示 Account 数据结构)
jss
2019-07-11 21:30:51 +08:00
@pubby
是这样的
type user struct {

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

}

type Account struct {

ID int32
UserId int32
......

}

正常查询结果是有 Account 关联数据的,但是另一个接口 不需要 Account 的数据 ,我如何在不改变结构体关联关系而取消关联,(即在查询结果中只显示 ID,Name;不显示 Account 数据结构)
Aoang
2019-07-11 21:37:26 +08:00
type T struct {
Username string `json:"username"`

Password string `json:"-"`
}
pubby
2019-07-11 21:48:00 +08:00
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
}
sunmoon1983
2019-07-11 22:16:13 +08:00
插眼
eslizn
2019-07-11 22:17:37 +08:00
jss
2019-07-12 10:08:09 +08:00
@pubby omitempty 可行,但是对于列表查询如何处理里面的 “ account ” 如:
var list []User

数据结构如下:
{
"data":[
{
"id": 1,
"name":"name",
"account":{
"id":0,
"mobile":"",
"password":""
}
},{
"id": 2,
"name":"names",
"account":{
"id":0,
"mobile":"",
"password":""
}
},
]
}
pubby
2019-07-12 10:47:43 +08:00
@jss 循环一遍转成[]T 啊

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

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

//.....
}

Users(users).Convert()

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/582147

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX