Skip to content

gorm

【一些 discussions】

Preload runs multiple sql queries · Issue #1436 · go-gorm/gorm: https://github.com/go-gorm/gorm/issues/1436

【联合查找】

A -> B <- C:这样子需要把 A 和 C 关联到一起的,需要中间商 B

那么法一:

A 结构体里指定B, B结构体里再指定C,preload B 和 B.C。

这样获得的 C 的数据实际在 B 的结构体里

法二:

A结构体里指定 -> B 和 C join 后的产物

type DataBelongRelationWithParkPostion struct {
 model.DataBelongRelation
 ParkPosition *model.ParkPosition `gorm:"ForeignKey:DataID; AssociationForeignKey:ID" json:"parkPosition"`
}

type Car struct {
 model.Car
 User     *model.User  `gorm:"ForeignKey:UserID;AssociationForeignKey:ID" json:"user"`
 DataRelation *model.DataBelongRelation 
}

po.DBFilter(db)
 .Preload("DataRelation", func(db *gorm.DB) *gorm.DB  {  
    tableName :=  db.NewScope(model.DataBelongRelation{}).TableName()  
    return db.Table(tableName).
     Joins("left join park_positions on park_positions.id =  data_belong_relations.data_id").
     Where("data_belong_relations.closed <> 1 and  data_belong_relations.type in (?) and (expiration = 0 or expiration is null  or expiration > ?)", []int{  model.DataRelationTypeParkingLotCarParkPostionRent,  model.DataRelationTypeParkingLotCarParkPostionFixed,},
time.Now().Unix(),).Select("park_positions.*, data_belong_relations.owner_id as owner_id")  }). // => {"id":"1234567890123456789012345678901234567890","code":"","projId":"2785d34f49984d45926ee7d76d035ef9","userId":"", dataRelation":null}