forked from mirror/gorm
41 lines
1.4 KiB
Markdown
41 lines
1.4 KiB
Markdown
# Preloading (Eager loading)
|
|
|
|
```go
|
|
db.Preload("Orders").Find(&users)
|
|
//// SELECT * FROM users;
|
|
//// SELECT * FROM orders WHERE user_id IN (1,2,3,4);
|
|
|
|
db.Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users)
|
|
//// SELECT * FROM users;
|
|
//// SELECT * FROM orders WHERE user_id IN (1,2,3,4) AND state NOT IN ('cancelled');
|
|
|
|
db.Where("state = ?", "active").Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users)
|
|
//// SELECT * FROM users WHERE state = 'active';
|
|
//// SELECT * FROM orders WHERE user_id IN (1,2) AND state NOT IN ('cancelled');
|
|
|
|
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
|
|
```
|
|
|
|
#### Custom Preloading SQL
|
|
|
|
You could custom preloading SQL by passing in `func(db *gorm.DB) *gorm.DB` (same type as the one used for [Scopes](#scopes)), for example:
|
|
|
|
```go
|
|
db.Preload("Orders", func(db *gorm.DB) *gorm.DB {
|
|
return db.Order("orders.amount DESC")
|
|
}).Find(&users)
|
|
//// SELECT * FROM users;
|
|
//// SELECT * FROM orders WHERE user_id IN (1,2,3,4) order by orders.amount DESC;
|
|
```
|
|
|
|
#### Nested Preloading
|
|
|
|
```go
|
|
db.Preload("Orders.OrderItems").Find(&users)
|
|
db.Preload("Orders", "state = ?", "paid").Preload("Orders.OrderItems").Find(&users)
|
|
```
|