Gorm 在结构中填充结构,结果无法完全正常工作
Gorm fill struct within a struct with the results not fully working
我在 Gorm 中做了一个简单的查询:
err := db.Preload("users").
Where("orders.created_at >= now() - interval 3 day").
Find(&orders).
Error
我也这样试过:
err := db.Select("orders.*, users.*").
Where("orders.created_at >= now() - interval 3 day and users.first_name != ''").
Joins("left join users on users.customer_id = orders.customer_id").
Find(&orders).
Error
这应该填充一个“订单”结构,其中有一个“用户用户”结构。当我记录我的查询时它看起来很好,当我将它复制并粘贴到 Phpmyadmin 时它完美地工作,但在 Go 中我的结构是空的!好吧...“用户”部分是空的。订单部分填写正确。有谁知道我做错了什么?我的订单结构:
type Orders struct {
CustomerId int
Users Users `gorm:"foreignKey:customer_id"`
Method string
Amount float64
Subtotal float64
Total float64
Btw float64
Status string
OrderMailSend int
}
我的用户结构:
type Users struct {
CustomerId int
Email string
FirstName string
LastName string
}
如果我使用我的第一个查询并调用它(在 Go 中),我将收到此结果:
{
"CustomerId": 211197,
"Users": {
"CustomerId": 0,
"Email": "",
"FirstName": "",
"LastName": ""
},
"Method": "iDEAL",
"Amount": 10,
"Subtotal": 10,
"Total": 10,
"Btw": 0,
"Status": "paid",
"OrderMailSend": 0
}
连同错误:无法为 models.Orders
预加载现场用户
如果我只是将查询本身复制并粘贴到 phpmyadmin 控制台中,然后 运行 它,我确实会得到完整的结果,即一个用户连接到它的订单。所以这意味着查询本身没问题我侦察。
在数据库中订单 table (customer_id) 有一个指向用户 table (customer_id) 的外键。
第一件事:尝试将您的 Users 键字段重命名为 CustomerID,这是可行的方法,gorm 似乎也喜欢这样。
此外,您的 Order 结构没有主键。这可能会把事情搞砸。
有了这个,第一个查询应该可以了。
第二个查询不会神奇地填充 Users
结构,因为 Find
方法只扫描顶级实体。
Joins
with custom join SQL 正如你所使用的那样不会告诉 gorm 也将额外的字段扫描到子实体中。
但由于这是一对一的关系,您应该能够使用 Joins preloading,它会产生与您的 Preload 查询类似的结果,但都在单个数据库查询中。
err := db.
Joins("Users").
Where("orders.created_at >= now() - interval 3 day AND users.first_name != ''").
Find(&orders).
Error
我在 Gorm 中做了一个简单的查询:
err := db.Preload("users").
Where("orders.created_at >= now() - interval 3 day").
Find(&orders).
Error
我也这样试过:
err := db.Select("orders.*, users.*").
Where("orders.created_at >= now() - interval 3 day and users.first_name != ''").
Joins("left join users on users.customer_id = orders.customer_id").
Find(&orders).
Error
这应该填充一个“订单”结构,其中有一个“用户用户”结构。当我记录我的查询时它看起来很好,当我将它复制并粘贴到 Phpmyadmin 时它完美地工作,但在 Go 中我的结构是空的!好吧...“用户”部分是空的。订单部分填写正确。有谁知道我做错了什么?我的订单结构:
type Orders struct {
CustomerId int
Users Users `gorm:"foreignKey:customer_id"`
Method string
Amount float64
Subtotal float64
Total float64
Btw float64
Status string
OrderMailSend int
}
我的用户结构:
type Users struct {
CustomerId int
Email string
FirstName string
LastName string
}
如果我使用我的第一个查询并调用它(在 Go 中),我将收到此结果:
{
"CustomerId": 211197,
"Users": {
"CustomerId": 0,
"Email": "",
"FirstName": "",
"LastName": ""
},
"Method": "iDEAL",
"Amount": 10,
"Subtotal": 10,
"Total": 10,
"Btw": 0,
"Status": "paid",
"OrderMailSend": 0
}
连同错误:无法为 models.Orders
预加载现场用户如果我只是将查询本身复制并粘贴到 phpmyadmin 控制台中,然后 运行 它,我确实会得到完整的结果,即一个用户连接到它的订单。所以这意味着查询本身没问题我侦察。
在数据库中订单 table (customer_id) 有一个指向用户 table (customer_id) 的外键。
第一件事:尝试将您的 Users 键字段重命名为 CustomerID,这是可行的方法,gorm 似乎也喜欢这样。
此外,您的 Order 结构没有主键。这可能会把事情搞砸。
有了这个,第一个查询应该可以了。
第二个查询不会神奇地填充 Users
结构,因为 Find
方法只扫描顶级实体。
Joins
with custom join SQL 正如你所使用的那样不会告诉 gorm 也将额外的字段扫描到子实体中。
但由于这是一对一的关系,您应该能够使用 Joins preloading,它会产生与您的 Preload 查询类似的结果,但都在单个数据库查询中。
err := db.
Joins("Users").
Where("orders.created_at >= now() - interval 3 day AND users.first_name != ''").
Find(&orders).
Error