GORM 预加载:如何使用自定义表名

我有一个带有预加载的GORM查询,它工作得很好,因为我将其绑定到一个名为“companies”的结构,这也是相应数据库表的名称:


var companies []Company

db.Preload("Subsidiaries").Joins("LEFT JOIN company_prod ON company_products.company_id = companies.id").Where("company_products.product_id = ?", ID).Find(&companies)

现在我想做类似的事情,但将结果绑定到一个没有引用“companies”表的名称的结构:


var companiesFull []CompanyFull

db.Preload("Subsidiaries").Joins("LEFT JOIN company_prod ON company_products.company_id = companies.id").Where("company_products.product_id = ?", ID).Find(&companies)

为了更好地理解,我简化了第二个调用,真正的调用有更多的JOIN并返回更多的数据,因此它不能绑定到“公司”结构。


但是我收到一个错误:


column company_subsidiaries.company_full_id does not exist

相应的 SQL 查询:


SELECT * FROM "company_subsidiaries" WHERE "company_subsidiaries"."company_full_id" IN (2,1)

没有“company_subsidiaries.company_full_id”,正确的查询应该是:


SELECT * FROM "company_subsidiaries" WHERE "company_subsidiaries"."company_id" IN (2,1)

该条件显然是从结果绑定到的结构的名称生成的。有没有办法为此情况指定自定义名称?


我知道Tabler接口技术,但是它不适用于预加载,我相信(尝试过,它更改了主查询的表名,但不会更改预加载)。


森栏
浏览 175回答 1
1回答

猛跑小猪

在这种情况下,似乎要走的路可能是自定义公司中的关系Full模型。使用 joinForeignKey,以下代码有效。type CompanyFull struct {    Products     []*Product    `json:"products" gorm:"many2many:company_products;joinForeignKey:ID"`    Subsidiaries []*Subsidiary `json:"subsidiaries" gorm:"many2many:company_subsidiaries;joinForeignKey:ID"`    ID           int           `json:"ID,omitempty"`}func (CompanyFull) TableName() string {    return "companies"}func main(){...  result := db.Preload("Subsidiaries").Joins("LEFT JOIN company_products ON company_products.company_id = companies.id").Where("company_products.product_id = ?", ID).Find(&companies)  if result.Error != nil {    log.Println(result.Error)  } else {    log.Printf("%#v", companies)  }有关自定义关系中使用的外键的详细信息,请查看文档 https://gorm.io/docs/many_to_many.html#Override-Foreign-Key
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go