Your Question

I have this models:

Order struct {
    ID       string `gorm:"size:191;index"`
    Customer string
    Date     time.Time
    Items    []OrderItem `gorm:"many2many:order_items;"`
    Total    float64
}

Product struct {
    ID          string `gorm:"size:191;index"`
    Description string
    Price       float64
}

OrderItem struct {
    ID        string `gorm:"size:191;index"`
    OrderID   string `gorm:"size:191;index"`
    Order     Order
    ProductID string `gorm:"size:191;index"`
    Product   Product
    Price     float64
    Quantity  int
    Total     float64
}

When I run this query:

var orders []Order
gormDBInstance.Debug().Preload("Items").Preload("Items.Product").Find(&orders)

I'm geting this debug log output:

[3.324ms] [rows:2] SELECT * FROM `order_items` WHERE `order_items`.`order_id` = '046299c9-2611-4562-aac2-3fbd3f9eb812'
[9.025ms] [rows:1] SELECT * FROM `orders`
  • Note that the items select returns 2 rows so as 1 row for the master record order.
  • Note that there is no select for items product.

At the end I'm getting this result object:

[{"ID":"046299c9-2611-4562-aac2-3fbd3f9eb812","Customer":"Roberto","Date":"2024-07-12T02:59:07-03:00","Items":[],"Total":15025}]

Expected answer

I expected to receive the order and it items with each product on each item preloaded. Am I doing something wrong? The models are defined correctly? Is this a potential bug?

Comment From: nccapo

Update your OrderItem struct as follows: type OrderItem struct { ID string gorm:"size:191;index" OrderID string gorm:"size:191;index" Order Order gorm:"foreignKey:OrderID;references:ID" ProductID string gorm:"size:191;index" Product Product gorm:"foreignKey:ProductID;references:ID" Price float64 Quantity int Total float64 }

If this doesn't work then maybe you doesn't need many2many relationship and try Items []OrderItemgorm:"foreignKey:OrderID;references:ID"``

Also you have: var orders []Order gormDBInstance.Debug().Preload("Items").Preload("Items.Product").Find(&orders) which should be: var orders []Order gormDBInstance.Debug().Preload("Items.Product").Find(&orders) you don't need Items Preload again, Items.Product Preload Items and Items.Product also

Comment From: robertoneto-senior

Hi.

Thanks @Nicolas-ggd , I just removed the many2many tag and it started to work. I didn't even need to create the foreignKey tags, just removing the many2many.