如何用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
相关产品推荐
相关产品推荐

