首页 > 解决方案 > 如何(预加载)在自定义列上连接表?

问题描述

假设我们有以下模型:

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 的方法?请记住,以上所有代码都是对真正问题的模拟,我不想公开原始模型/查询。

标签: sqlpostgresqlgogo-gorm

解决方案


您可以使用Preload加载AddressesCompany对象中。

根据您描述的条件,您不想加载与您的过滤器不匹配的公司,您应该使用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)

推荐阅读