如何在GORM中预加载并筛选出拥有指定名称Account的Person记录
解决GORM中筛选拥有指定关联Account的Person记录问题
要筛选出拥有名称为foo的Account的Person记录,你之前使用的Preload仅对关联的Account做条件加载,并不会过滤Person本身,需要通过**关联表查询(Joins)**来实现核心筛选逻辑:
基础筛选方案
通过Joins关联accounts表,结合Where条件锁定符合要求的Person,同时用Distinct避免因一个Person存在多个符合条件的Account而产生重复记录:
var personList []Person DB.Joins("JOIN accounts ON accounts.person_id = persons.id"). Where("accounts.name = ?", "foo"). Distinct(). Find(&personList)
同时预加载符合条件的Accounts
如果需要同步加载这些Person对应的名称为foo的Accounts,可以在上述逻辑基础上追加Preload:
var personList []Person DB.Joins("JOIN accounts ON accounts.person_id = persons.id"). Where("accounts.name = ?", "foo"). Distinct(). Preload("Accounts", "name = ?", "foo"). Find(&personList)
模型定义补充提示
你的模型需要包含主键字段,否则GORM无法正确处理关联关系,建议补充主键定义:
type Person struct { ID string `gorm:"primaryKey"` Accounts []Account } type Account struct { ID string `gorm:"primaryKey"` Name string PersonID string }
内容的提问来源于stack exchange,提问作者arsenypoga
相关产品推荐
相关产品推荐

