Gorm连接表仅选择少数字段

iszxjhcz  于 2023-02-17  发布在  Go
关注(0)|答案(1)|浏览(183)

我有一些代码

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做同样的事情
附言:我不想使用轻量级模型的钱包查询只有价值,我想使用单一模型的数据库表示

xzlaal3s

xzlaal3s1#

我也希望Gorm支持此功能,但我想到的最佳解决方案是智能选择,但它需要我们手动编写查询和选择字段

type CustomUser struct {
    Id uint `gorm:"column:id"`
    Name string `gorm:"column:name"`
    Valute string `gorm:"column:valute"`
}

var users []CustomUser

db.Raw("SELECT users.id, users.name, Wallet.valute FROM `users` LEFT JOIN `wallets` `Wallet` ON `users`.`wallet_id` = `Wallet`.`id`").Find(&users)

相关问题