我有一些代码
type User struct {
Id uint `gorm:"column:id"`
Name string `gorm:"column:name"`
WalletId uint `gorm:"column:wallet_id"`
Wallet Wallet `gorm:"foreignkey:club_id"`
}
type Wallet struct {
Id uint `gorm:"column:id"`
Money uint `gorm:"column:money"`
Valute string `gorm:"column:valute"`
}
我可以像这样查询用户及其钱包
var users []users
db.Joins("Wallet").Find(&users)
这将生成这样的stmt
SELECT user.id, user.name, user.wallet_id, wallet.id, wallet.Money, wallet.Valute from user join wallet on user.wallet_id = wallet.id
我需要查询所有用户,仅查询他们钱包中的“Valute”字段
我想用一个像
var users []users
db.Joins("Wallet", db.Select("Valute")).Find(&users)
用于生成此语句
SELECT user.id, user.name, user.wallet_id, wallet.Valute from user join wallet on user.wallet_id = wallet.id
为选择一个wallet字段。但是它根本不起作用。虽然在函数注解中有这样的用法
// Joins specify Joins conditions
// db.Joins("Account").Find(&user)
// db.Joins("JOIN emails ON emails.user_id = users.id AND emails.email = ?", "jinzhu@example.org").Find(&user)
// db.Joins("Account", DB.Select("id").Where("user_id = users.id AND name = ?", "someName").Model(&Account{}))
func (db *DB) Joins(query string, args ...interface{}) (tx *DB) {
在Preload
的紧急加载中,我可以选择如下字段
db.Limit(1000).Preload("Wallet",
func(db *gorm.DB) *gorm.DB {
return db.Select("valute")
},
).Find(&users)
但是这对我来说不是一个好的用法,当查询一个对象时,它的性能很差。我想知道我如何对Joins
做同样的事情
附言:我不想使用轻量级模型的钱包查询只有价值,我想使用单一模型的数据库表示
1条答案
按热度按时间xzlaal3s1#
我也希望Gorm支持此功能,但我想到的最佳解决方案是智能选择,但它需要我们手动编写查询和选择字段