为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
森栏 2022-08-15 17:31:26
我有一个带有预加载的GORM查询,它工作得很好,因为我将其绑定到一个名为“companies”的结构,这也是相应数据库表的名称:var companies []Companydb.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 []CompanyFulldb.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接口技术,但是它不适用于预加载,我相信(尝试过,它更改了主查询的表名,但不会更改预加载)。
查看完整描述

1 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

在这种情况下,似乎要走的路可能是自定义公司中的关系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


查看完整回答
反对 回复 2022-08-15
  • 1 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信