定義了一個(gè) User 和 Company, User 中可以包含多個(gè) Company, 如下:
type User struct {
ID int `gorm:"TYPE:int(11);NOT NULL;PRIMARY_KEY;INDEX"`
Name string `gorm:"TYPE: VARCHAR(255); DEFAULT:'';INDEX"`
Companies []Company `gorm:"FOREIGNKEY:UserId;ASSOCIATION_FOREIGNKEY:ID"`
CreatedAt time.Time `gorm:"TYPE:DATETIME"`
UpdatedAt time.Time `gorm:"TYPE:DATETIME"`
DeletedAt *time.Time `gorm:"TYPE:DATETIME;DEFAULT:NULL"`
}
type Company struct {
gorm.Model
Industry int `gorm:"TYPE:INT(11);DEFAULT:0"`
Name string `gorm:"TYPE:VARCHAR(255);DEFAULT:'';INDEX"`
Job string `gorm:"TYPE:VARCHAR(255);DEFAULT:''"`
UserId int `gorm:"TYPE:int(11);NOT NULL;INDEX"`
}
在查詢 User 時(shí)希望把 Company 的信息也一并查詢, 有以下三種方法:
Related
使用 Related 方法, 需要把把 User 查詢好, 然后根據(jù) User 定義中指定的 FOREIGNKEY 去查找 Company, 如果沒定義, 則調(diào)用時(shí)需要指定, 如下:
var u User
db.First(&u)
db.Model(&u).Related(&u.Companies).Find(&u.Companies)
User 列表時(shí)遍歷列表一一查詢 Company
Association
使用 Association 方法, 需要把把 User 查詢好, 然后根據(jù) User 定義中指定的 AssociationForeignKey 去查找 Company, 必須定義, 如下:
var u User
db.First(&u)
db.Model(&u).Association("Companies").Find(&u.Companies)
Preload
使用 Preload 方法, 在查詢 User 時(shí)先去獲取 Company 的記錄, 如下:
// 查詢單條 user
var u User
db.Debug().Preload("Companies").First(&u)
// 對應(yīng)的 sql 語句
// SELECT * FROM users LIMIT 1;
// SELECT * FROM companies WHERE user_id IN (1);
// 查詢所有 user
var list []User
db.Debug().Preload("Companies").Find(&list)
// 對應(yīng)的 sql 語句
// SELECT * FROM users;
// SELECT * FROM companies WHERE user_id IN (1,2,3...);
本文中是一對多, 一對一的也是類似的, 完整代碼見: GORM Related