我有一个数据库,其中一个表通过进行管理
type Token struct {
gorm.Model
Value string
User User
UserID uint
}
在某个时刻,我试图检索该表中的所有元素,但仅限于一个字段(Users
(。当在没有Select()
的情况下进行查询时,我得到了预期的一切:
var tokens []Token
db.
Preload("User").
// Select("User").
Find(&tokens)
输出摘录:
(...)
{
"ID": 27,
"CreatedAt": "2022-03-11T20:24:01.0505503+01:00",
"UpdatedAt": "2022-03-11T20:24:01.0505503+01:00",
"DeletedAt": null,
"Value": "admintoken",
"User": {
"ID": 27,
"CreatedAt": "2022-03-11T20:24:01.0521975+01:00",
"UpdatedAt": "2022-03-11T20:24:01.0521975+01:00",
"DeletedAt": null,
"UserName": "admin",
"UserType": {
"ID": 0,
"Name": "",
"UserID": 0
}
}
}
(...)
由于我只想得到"User"
对象,我尝试了
var tokens []Token
db.
Preload("User").
Select("User").
Find(&tokens)
但现在输出为空。
Select()
应该反对什么
要选择所有至少有一个令牌的用户,可以使用以下查询:
var users []User
db.Where("id IN (?)","SELECT DISTINCT(user_id) FROM tokens").Find(&users)
我不认为预加载是一个好的选择,因为它会进行2次查询来检索结果,如果你只能在1次查询中检索预期结果,为什么要进行2次搜索
要检索具有令牌代码的用户,可以更新如下:
var users []User
db.Table("users").Select("users.id, users.name").Joins("inner join tokens on tokens.user_id = users.id").Find(&users)
rows, err := db.Table("users").Select("users.id, users.name").Joins("inner join tokens on tokens.user_id = users.id").Rows()
for rows.Next() {
...
}