Gorm在结构中填充结构,结果无法完全工作
我用Gorm做了一个简单的查询:Gorm在结构中填充结构,结果无法完全工作,go,go-gorm,Go,Go Gorm,我用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
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
这应该填充一个“orders”结构,其中包含一个“Users”结构。当我记录查询时,它看起来很好,当我复制并粘贴到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
}
和我的用户结构:
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
}
还有一个错误:无法为模型预加载字段用户。订单
如果我只是在phpmyadmin控制台中复制并粘贴查询本身并运行它,我会得到完整的结果,即一个用户连接到一个订单。这意味着查询本身是正确的
在数据库中,orders表(customer\u id)有一个指向users表(customer\u id)的外键。第一件事:尝试将您的users key字段重命名为CustomerID,这是正确的方法,gorm似乎也喜欢这样 此外,Order结构没有主键。那可能会把戈尔的事情搞砸 这样,第一个查询就可以工作了 第二个查询不会神奇地填充
Users
结构,因为Find
方法只扫描顶级实体
使用您所使用的自定义联接SQL联接
,不会告诉gorm也将额外字段扫描到子实体中
但是,由于这是一对一的关系,您应该能够使用它来生成与预加载查询类似的结果,但都在一个数据库查询中
err:=db。
加入(“用户”)。
其中(“orders.created_at>=now()-间隔3天,users.first_name!=”)。
查找订单(&O)。
错误
第一个查询是否正常工作(即用户结构是否已填充)?否,我收到一个错误,无法为models.Orders预加载字段用户。但是第一个代码是否会填充用户结构?它将填充“order”结构,但将“order”结构中的“Users”结构保留为空值。还要注意,gorm通常将结构命名为单数名词,表命名为复数。这不会影响功能,但有助于更合理的代码阅读。这确实有效,非常感谢Ezequiel!最后一个问题。。。我的“条件”在预加载中被忽略。我只想在用户存在的情况下接收“订单”,即first_name不为空。错误:=db.Preload(“用户”,“名字不为空”)。其中(“orders.created\u at>=now()-间隔3天”)。查找(&orders)。错误