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)

浙公网安备 33010602011771号