gorm 关联查询总结
结构体:
type Device struct { ID int64 `gorm:"column:id" json:"id"` HardwareId string `gorm:"column:hardware_id" json:"hardwareId"` ModelId int64 `gorm:"column:model_id" json:"modelId"` IsBind int64 `gorm:"column:is_bind" json:"isBind"` ReleaseDate webgo.JsonDateTime `gorm:"column:release_date" json:"releaseDate"` StoreId int64 `gorm:"column:store_id" json:"storeId"` Status int64 `gorm:"column:status" json:"status"` CreateTime webgo.JsonDateTime `gorm:"column:create_time" json:"createTime"` UpdateTime webgo.JsonDateTime `gorm:"column:update_time" json:"updateTime"` DeviceNumber string `gorm:"column:device_number" json:"deviceNumber"` Alias string `gorm:"column:alias" json:"alias"` OnlineDevice string `json:"onlineDevice"` OtherData map[string]interface{} DeviceModular []DeviceModular `gorm:"ForeignKey:DeviceID"` }
type DeviceModular struct { ID int64 `gorm:"column:id" json:"id"` DeviceId int64 `gorm:"column:device_id" json:"deviceId"` ModularId int64 `gorm:"column:modular_id" json:"modularId"` ModularType int64 `gorm:"column:modular_type" json:"modularType"` InstallSite int64 `gorm:"column:install_site" json:"installSite"` ConType int64 `gorm:"column:con_type" json:"conType"` CreateTime webgo.JsonDateTime `gorm:"column:create_time" json:"createTime"` Coin int64 `gorm:"column:coin" json:"coin"` CtrlFall int64 `gorm:"column:ctrl_fall" json:"ctrlFall"` DefaultFall int64 `gorm:"column:default_fall" json:"defaultFall"` ActualFall int64 `gorm:"column:actual_fall" json:"actualFall"` CommWeimaqi CommWeimaqi `gorm:"ForeignKey:ID;"` }
type CommWeimaqi struct { ID int64 `gorm:"column:id" json:"id"` WeimaqiId string `gorm:"column:weimaqi_id" json:"weimaqiId"` Tag string `gorm:"column:tag" json:"tag"` MarkeType string `gorm:"column:marke_type" json:"markeType"` Rssi string `gorm:"column:rssi" json:"rssi"` IsBind int64 `gorm:"column:is_bind" json:"isBind"` HardwareVersion string `gorm:"column:hardware_version" json:"hardwareVersion"` NetworkingType int64 `gorm:"column:networking_type" json:"networkingType"` Status int64 `gorm:"column:status" json:"status"` CreateTime webgo.JsonDateTime `gorm:"column:create_time" json:"createTime"` UpdateTime webgo.JsonDateTime `gorm:"column:update_time" json:"updateTime"` }
三个结构体 device里面包含多个devicemodular, devicemodular 包含一个commweimaqi
现在需要查询单条device记录和多条device记录,并将其中的关联的关系数据一起查询出来
var device []model.Device //db.SqlDB.First(&device).Preload("CommWeimaqi").Related(&device.DeviceModular) //查询单条device记录 db.SqlDB.Preload("DeviceModular.CommWeimaqi").Preload("DeviceModular").Find(&device) //查询所有device记录
type User struct {
gorm.Model
Name string
Company []Company
}
type Company struct {
gorm.Model
Job string
User User
UserID int
}
var user User
var company []Company
user.ID = 1
db.Model(&user).Related(&company)
db.Model(&user).Association("company").Find(&company)
使用Related和Association都可以查询出来关联的company的数据.那他们的差异是什么呢?### 题目描述
二者区别在于谁主谁从
下述代码中user表是源,company关联源中的字段名,简而言之通过先查user-->commpany 最终的主表记录从user出发
db.Model(&user).Association("company").Find(&company)
而Related方法其内的company表是要查主表源,主查company表user实例只是条件填充对象
db.Model(&user).Related(&company)
//// SELECT * FROM company WHERE user_id = 1; // 1 is user's primary key
开启sql打印一目了然
// 启用Logger,显示详细日志
db.LogMode(true)