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)

相关