定義了一個 User
和 Company
, User
中能夠包含多個 Company
, 以下:git
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
時但願把 Company
的信息也一併查詢, 有如下三種方法:github
使用 Related
方法, 須要把把 User
查詢好, 而後根據 User
定義中指定的 FOREIGNKEY
去查找 Company
, 若是沒定義, 則調用時須要指定, 以下:sql
var u User db.First(&u) db.Model(&u).Related(&u.Companies).Find(&u.Companies)
User
列表時遍歷列表一一查詢 Company
code
使用 Association
方法, 須要把把 User
查詢好, 而後根據 User
定義中指定的 AssociationForeignKey
去查找 Company
, 必須定義, 以下:orm
var u User db.First(&u) db.Model(&u).Association("Companies").Find(&u.Companies)
使用 Preload
方法, 在查詢 User
時先去獲取 Company
的記錄, 以下:ci
// 查詢單條 user var u User db.Debug().Preload("Companies").First(&u) // 對應的 sql 語句 // SELECT * FROM users LIMIT 1; // SELECT * FROM companies WHERE user_id IN (1); // 查詢全部 user var list []User db.Debug().Preload("Companies").Find(&list) // 對應的 sql 語句 // SELECT * FROM users; // SELECT * FROM companies WHERE user_id IN (1,2,3...);
本文中是一對多, 一對一的也是相似的, 完整代碼見: GORM Relatedget