簡體   English   中英

GORM preload:如何使用自定義表名

[英]GORM preload: How to use a custom table name

我有一個預加載的 GORM 查詢,它工作得很好,因為我將它綁定到一個名為“公司”的結構,這也是相應數據庫表的名稱:

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)

現在我想做類似的事情,但將結果綁定到一個沒有引用“公司”表的名稱的結構:

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 接口技術,但是我相信它不適用於 Preload(嘗試過,它更改了主查詢的表名,但不更改預加載)。

更新:有關數據庫架構和結構的更多信息

數據庫模式

TABLE companies
ID Primary key
OTHER FIELDS

TABLE products
ID Primary key
OTHER FIELDS 

TABLE subsidiaries
ID Primary key
OTHER FIELDS

TABLE company_products
ID Primary key
Company_id Foreign key (companies.id)
Product_id Foreign key (products.id)

TABLE company_subsidiaries
ID Primary key
Company_id Foreign key (companies.id)
Subsidiary_id Foreign key (subsidiaries.id)

結構

type Company struct {
    Products     []*Product `json:"products" gorm:"many2many:company_products;"`
    ID           int        `json:"ID,omitempty"`
}

type CompanyFull struct {
    Products     []*Product `json:"products" gorm:"many2many:company_products;"`
    Subsidiaries []*Subsidiary `json:"subsidiaries" gorm:"many2many:company_products;"`
    ID           int        `json:"ID,omitempty"`
}

type Product struct {
    Name     string `json:"name"`
    ID       int    `json:"ID,omitempty"`
}

type Subsidiary struct {
    Name     string `json:"name"`
    ID       int    `json:"ID,omitempty"`
}

生成的 SQL (by GORM)

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

SELECT * FROM "subsidiaries" WHERE "subsidiaries"."id" IN (NULL)

SELECT companies.*, company_products.*, FROM "companies" LEFT JOIN company_products ON company_products.company_id = companies.id WHERE company_products.product_id = 1

在這種情況下,似乎 go 的方式可能是在您的 CompanyFull model 中自定義關系。 使用 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM