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}