プリロード
GORMでは、`Preload`を使用して、他のSQLでリレーションを積極的ロードできます。例えば、
type User struct { |
結合プリロード
`Preload`は関連データを別のクエリでロードしますが、`Join Preload`はleft joinを使用して関連データをロードします。例えば、
db.Joins("Company").Joins("Manager").Joins("Account").First(&user, 1) |
条件付き結合
db.Joins("Company", DB.Where(&Company{Alive: true})).Find(&users) |
ネストされたモデルの結合
db.Joins("Manager").Joins("Manager.Company").Find(&users) |
**注意** `Join Preload`は、`has one`、`belongs to`など、1対1のリレーションで動作します。
すべてプリロード
`clause.Associations`は、作成/更新時に`Select`と同様に`Preload`と連携して動作し、すべての関連付けを`Preload`するために使用できます。例えば、
type User struct { |
`clause.Associations`はネストされた関連付けをプリロードしませんが、ネストされたプリロードと一緒に使用できます。例えば、
db.Preload("Orders.OrderItems.Product").Preload(clause.Associations).Find(&users) |
条件付きプリロード
GORMでは、条件付きで関連付けをプリロードできます。これは、インライン条件と同様に動作します。
// Preload Orders with conditions |
カスタムプリロードSQL
`func(db *gorm.DB) *gorm.DB`を渡すことで、プリロードSQLをカスタマイズできます。例えば、
db.Preload("Orders", func(db *gorm.DB) *gorm.DB { |
ネストされたプリロード
GORMはネストされたプリロードをサポートしています。例えば、
db.Preload("Orders.OrderItems.Product").Preload("CreditCard").Find(&users) |
埋め込みプリロード
埋め込みプリロードは、埋め込み構造体、特に
同じ構造体で使用されます。埋め込みプリロードの構文はネストされたプリロードと似ており、ドットで区切られます。
例えば、
type Address struct { |
あいまいさがなければ、埋め込み部分を省略できます。
type Address struct { |
**注意** `Embedded Preload`は、`belongs to`リレーションでのみ動作します。
他のリレーションの値はデータベース内で同じであるため、区別できません。