Я пытаюсь изучить Go and Gorm, создав небольшой прототип приложения для управления заказами. База данных - MySQL. С простыми вопросами Горм был звездой. Однако при попытке получить набор результатов, включающий комбинацию «один ко многим» с отношением «имеет один», Горм, похоже, терпит неудачу. Несомненно, на самом деле это мое непонимание. Кажется, я не могу найти в Интернете примеров того, что я пытаюсь достичь. Любая помощь будет принята с благодарностью.
Go Structs
// Order
type Order struct {
gorm.Model
Status string
OrderItems []OrderItem
}
// Order line item
type OrderItem struct {
gorm.Model
OrderID uint
ItemID uint
Item Item
Quantity int
}
// Product
type Item struct {
gorm.Model
ItemName string
Amount float32
}
Таблицы базы данных
orders
id | status
1 | pending
order_items
id | order_id | item_id | quantity
1 | 1 | 1 | 1
2 | 1 | 2 | 4
items
id | item_name | amount
1 | Go Mug | 12.49
2 | Go Keychain | 6.95
3 | Go T-Shirt | 17.99
Текущий запрос
order := &Order
if err := db.Where("id = ? and status = ?", reqOrder.id, "pending")
.First(&order).Error; err != nil {
fmt.Printf(err.Error())
}
db.Model(&order).Association("OrderItems").Find(&order.OrderItems)
Результаты (gorm выполняет 2 запроса в базе данных)
order == Order {
id: 1,
status: pending,
OrderItems[]: {
{
ID: 1,
OrderID: 1,
ItemID: 1,
Item: nil,
Quantity: 1,
},
{
ID: 2,
OrderID: 1,
ItemID: 2,
Item: nil,
Quantity: 4,
}
}
Альтернативный запрос
order := &Order
db.Where("id = ? and status = ?", reqOrder.id, "cart")
.Preload("OrderItems").Preload("OrderItems.Item").First(&order)
Результаты (gorm выполняет запросы размером 3 дБ)
order == Order {
id: 1,
status: pending,
OrderItems[]: {
{
ID: 1,
OrderID: 1,
ItemID: 1,
Item: {
ID: 1,
ItemName: Go Mug,
Amount: 12.49,
}
Quantity: 1,
},
{
ID: 2,
OrderID: 1,
ItemID: 2,
Item: {
ID: 2,
ItemName: Go Keychain,
Amount: 6.95,
},
Quantity: 4,
}
}
Идеальные результаты
Приведенный выше «Альтернативный запрос» дает идеальные результаты. Однако для этого Горм выполняет 3 отдельных запроса к базе данных. В идеале те же результаты были бы достигнуты с помощью 1 (или 2) запросов к базе данных.
Это можно сделать в MySQL с помощью пары соединений. Горм допускает присоединения. Но я надеялся воспользоваться магией отношений Горма.
Огромное спасибо!