> 默認情況下GORM因為性能問題,不會自動加載關聯屬性的值,gorm通過Preload函數支持預加載(Eager loading)關聯數據,下面介紹預加載關聯數據的方法。
[TOC]
## 預加載例子
~~~
// 用戶表
type User struct {
gorm.Model
Username string
Orders []Orders // 關聯訂單,一對多關聯關系
}
// 訂單表
type Orders struct {
gorm.Model
UserID uint // 外鍵字段
Price float64
}
// 預加載Orders字段值,Orders字段是User的關聯字段
db.Preload("Orders").Find(&users)
// 下面是自動生成的SQL,自動完成關聯查詢
//// SELECT * FROM users;
//// SELECT * FROM orders WHERE user_id IN (1,2,3,4);
// Preload第2,3個參數支持設置SQL語句條件和綁定參數
db.Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users)
// 自動生成的SQL如下
//// SELECT * FROM users;
//// SELECT * FROM orders WHERE user_id IN (1,2,3,4) AND state NOT IN ('cancelled');
// 通過組合Where函數一起設置SQL條件
db.Where("state = ?", "active").Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users)
// 自動生成的SQL如下
//// SELECT * FROM users WHERE state = 'active';
//// SELECT * FROM orders WHERE user_id IN (1,2) AND state NOT IN ('cancelled');
// 預加載Orders、Profile、Role多個關聯屬性
// ps: 預加載字段,必須是User的屬性
db.Preload("Orders").Preload("Profile").Preload("Role").Find(&users)
//// SELECT * FROM users;
//// SELECT * FROM orders WHERE user_id IN (1,2,3,4); // has many
//// SELECT * FROM profiles WHERE user_id IN (1,2,3,4); // has one
//// SELECT * FROM roles WHERE id IN (4,5,6); // belongs to
~~~
## 自動預加載
~~~
type User struct {
gorm.Model
Name string
CompanyID uint
Company Company `gorm:"PRELOAD:false"` // 通過標簽屬性關閉預加載
Role Role // 默認開啟預加載特性
}
// 通過Set設置gorm:auto_preload屬性,開啟自動預加載,查詢的時候才會自動完成關聯查詢
db.Set("gorm:auto_preload", true).Find(&users)
~~~
## 嵌套預加載
~~~
// 預加載User.Orders.OrderItems屬性值,使用點連接嵌套屬性即可
db.Preload("Orders.OrderItems").Find(&users)
db.Preload("Orders", "state = ?", "paid").Preload("Orders.OrderItems").Find(&users)
~~~
- 基礎知識
- 開發環境
- 包名規則
- 包初始化 (init)
- 基礎數據類型
- 基礎類型轉換
- 格式化輸出
- go指針
- 流程控制語句
- 函數定義
- 匿名函數
- 數組和切片
- map集合
- 結構體
- Interface接口
- 日期處理
- 數學計算
- 正則表達式
- 協程 (并發處理)
- channel
- waitgroup
- mutex (鎖機制)
- websocket
- protobuf
- Redis
- 錯誤處理
- 打包程序
- NSQ消息隊列
- 單元測試
- beego
- 安裝入門
- Gin
- 快速入門
- 路由與控制器
- 處理請求參數
- 表單驗證
- 處理響應結果
- 渲染HTML模版
- 訪問靜態文件
- Gin中間件
- Cookie處理
- Session處理
- Gin上傳文件
- swagger
- pprof性能測試
- GORM
- 入門教程
- 模型定義
- 數據庫連接
- 插入數據
- 查詢數據
- 更新數據
- 刪除數據
- 事務處理
- 關聯查詢
- 屬于 (BELONG TO)
- 一對一 (Has One)
- 一對多 (Has Many)
- 多對多 (Many to Many)
- 預加載 (Preloading)
- 錯誤處理
- 第三方常用插件
- viper 讀取配置文件
- zap 高性能日志
- Nginx代理配置
- Goland 快捷鍵