是针对表中的键执行Select()吗's结构

  • 本文关键字:结构 Select 执行 go-gorm
  • 更新时间 :
  • 英文 :


我有一个数据库,其中一个表通过进行管理

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() {
...
}

相关内容

  • 没有找到相关文章

最新更新