2 回答
TA贡献1830条经验 获得超9个赞
您可以使用Preload加载Addresses到Company对象中。
根据您描述的条件,您不想加载与您的过滤器不匹配的公司,您应该使用INNER JOIN
两种选择:
首先,如果您的表名为company,那么您的查询应如下所示:
db.Table("company").
Preload("Addresses").
Joins("INNER JOIN addresses a ON a.company_id = company.id").
Where("a.country = ?", "Bulgaria").
Find(&companies)
其次,如果您的表名为companies,那么您应该尝试以下操作:
db.Preload("Addresses").
Joins("INNER JOIN addresses a ON a.company_id = companies.id").
Where("a.country = ?", "Bulgaria").
Find(&companies)
TA贡献1811条经验 获得超5个赞
如果您使用的是 Gorm v2,您可以通过关联对 has-one 和一对多执行 CRUD 操作:
var companies []Company
var addresses []Address
countries := []string{"Bulgaria"}
db.Model(&Address).Where("country IN (?)", countries).Find(&addresses)
// The key is using the previously fetched variable as the model for the association query
db.Model(&addresses).Association("CompanyID").Find(&companies)
这也适用于多对多关系。
在比较 Gorm 与原始 SQL 查询 ( db.Raw(SQLquery)) 时,您通常会看到性能下降。从好的方面来说,您不必处理在 Go 中构建原始 sql 字符串所增加的复杂性,这非常好。我个人在我的项目中结合使用原始查询和 gorm 构建的查询 :)
- 2 回答
- 0 关注
- 118 浏览
添加回答
举报