You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Gorm的Joins关联查询仅获取关联表指定字段

Gorm关联查询:通过Joins仅获取关联模型指定字段

问题还原

我定义了如下Gorm模型:

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"`
}

使用db.Joins("Wallet").Find(&users)会查询所有用户及关联钱包的全部字段,生成SQL:

SELECT user.id, user.name, user.wallet_id, wallet.id, wallet.Money, wallet.Valute from user join wallet on user.wallet_id = wallet.id 

现在需要查询所有用户,仅获取关联Wallet的Valute字段,期望生成SQL:

SELECT user.id, user.name, user.wallet_id, wallet.Valute from user join wallet on user.wallet_id = wallet.id 

尝试db.Joins("Wallet", db.Select("Valute")).Find(&users)无效,已知Preload可以实现但单对象查询性能不佳,也不想用仅含Valute的轻量Wallet模型,希望通过Joins完成需求。


解决方案

要实现这个需求,必须在Select中显式指定所有需要查询的字段,同时给关联表字段加上表名/别名,具体写法有两种:

写法1:直接写JOIN语句

db.Select("user.id, user.name, user.wallet_id, wallet.valute").
    Joins("JOIN wallet ON user.wallet_id = wallet.id").
    Find(&users)

写法2:利用Gorm关联名称简化

db.Select("users.id, users.name, users.wallet_id, wallets.valute").
    Joins("Wallet").
    Find(&users)

为什么之前的写法无效?

Gorm中Joins("关联名称", 子句)的第二个参数是用来给关联表添加WHERE过滤条件的,不是用来指定要查询的字段。比如Joins("Wallet", "wallet.valute = ?", "USD")是用来筛选出钱包币种为USD的用户,而不是限制查询的字段。

只有通过Select明确列出所有需要的字段,才能让Gorm生成你期望的SQL,同时避免查询不必要的字段。

额外注意

你User模型中Wallet关联的标签gorm:"foreignkey:club_id"看起来是笔误,应该改为gorm:"foreignkey:WalletId",这样Gorm才能正确识别User.WalletId和Wallet.Id的关联关系,否则可能出现关联查询异常。

内容的提问来源于stack exchange,提问作者LUI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:35:28