Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql GORM preload:如何使用自定义表名_Sql_Go_Go Gorm - Fatal编程技术网

Sql GORM preload:如何使用自定义表名

Sql GORM preload:如何使用自定义表名,sql,go,go-gorm,Sql,Go,Go Gorm,我有一个带有预加载的GORM查询,它工作正常,因为我将它绑定到一个名为companys的结构,该结构也是相应数据库表的名称: var companies []Company db.Preload("Subsidiaries").Joins("LEFT JOIN company_prod ON company_products.company_id = companies.id").Where("company_products.product_i

我有一个带有预加载的GORM查询,它工作正常,因为我将它绑定到一个名为companys的结构,该结构也是相应数据库表的名称:

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)
现在我想做一些类似的事情,但将结果绑定到一个结构,该结构没有引用companys表的名称:

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)
为了更好地理解,我简化了第二个调用,真正的调用有更多的连接并返回更多的数据,因此它不能绑定到companys结构

但我遇到了一个错误:

column company_subsidiaries.company_full_id does not exist
相应的SQL查询:

SELECT * FROM "company_subsidiaries" WHERE "company_subsidiaries"."company_full_id" IN (2,1)
没有公司\u子公司。公司\u完整\u id,正确的查询应为:

SELECT * FROM "company_subsidiaries" WHERE "company_subsidiaries"."company_id" IN (2,1)
条件显然是从结果绑定到的结构的名称生成的。有没有办法为这种情况指定自定义名称

我知道,尽管它不适用于预加载,但我相信我尝试过它,它会更改主查询的表名,但不会更改预加载

更新:有关DB架构和结构的更多信息

数据库模式

结构

由GORM生成的SQL


在这种情况下,似乎应该在您的公司完整模型中自定义关系。使用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)
  }

有关自定义关系中使用的外键的更多信息,请查看文档

是否可以提供有关DB模式的更多信息—不必是完整模式?我真的无法理解在提供信息的情况下查询是如何生成的。另外,如果您能提供更多关于建筑的信息,我们将不胜感激。非常感谢您指出缺失的部分!我不想太混淆,但显然没有提供足够的信息。
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"`
}
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
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)
  }