sql - 如何(预加载)在自定义列上连接表?
问题描述
假设我们有以下模型:
type Company struct {
gorm.Model
Name string
Addresses []Address
}
type Address struct {
gorm.Model
CompanyID uint64
Street string
City string
Country string
}
我想获取在特定位置有地址的所有公司(及其地址)。像这样的东西:
SELECT company.*, address.* FROM company
INNER JOIN address ON address.company_id = company.id AND address.country = 'Bulgaria'
因此,如果一家公司在特定位置没有地址,我根本不会得到它。我正在尝试这样的事情:
db.Joins("Addresses", "addresses.country = ?", "Bulgaria").Find(&companies)
但是,它不起作用,因为 GORM 不采用 Joins 的第二个参数(使用预加载连接时),所以我应该检查生成的查询并做出类似的事情:
db.Where(`"Address".country = ?`, "Bulgaria").Joins("Addresses").Find(&companies)
有没有更好的方法/不是 hacky 的方法?请记住,以上所有代码都是对真正问题的模拟,我不想公开原始模型/查询。
解决方案
您可以使用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)
推荐阅读
- wordpress - 没有 CSS 显示;OceanWP 儿童主题
- x86 - 哪种内存访问架构具有 i9 处理器?
- javascript - 通过 javascript / ajax 获取 php 循环的值
- eclipse - 如何使用 Maven Tycho 构建 Junit5 测试
- c# - C# - 提高搜索时的性能
- ms-access - 如何触发记录选择?
- json - Spring boot 和 Angular 中的 JSON 操作
- javascript - 即使 JSON 文件中不存在 slot.value,Alexa 也会激活意图
- ruby-on-rails - Gem 安装错误数量的参数(给定 1,预期为 0)
- javascript - 打字稿:属性“构造函数”的类型不兼容