GORM 關聯查詢

定義了一個 UserCompany, 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

使用 Related 方法, 須要把把 User 查詢好, 而後根據 User 定義中指定的 FOREIGNKEY 去查找 Company, 若是沒定義, 則調用時須要指定, 以下:sql

var u User
db.First(&u)
db.Model(&u).Related(&u.Companies).Find(&u.Companies)

User 列表時遍歷列表一一查詢 Companycode

Association

使用 Association 方法, 須要把把 User 查詢好, 而後根據 User 定義中指定的 AssociationForeignKey 去查找 Company, 必須定義, 以下:orm

var u User
db.First(&u)
db.Model(&u).Association("Companies").Find(&u.Companies)

Preload

使用 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

相關文章
相關標籤/搜索