在结构体中填充结构体,结果不能完全工作



我在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

这应该填一个"order "结构,该结构具有"Users "结构在其中。当我记录我的查询看起来很好,当我复制并粘贴到Phpmyadmin它工作完美,但在Go我的结构是空的!嗯…"users"部分是空的。订单部分填写正确。有人知道我做错了什么吗?我的订单结构:

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
}

和一个错误:can't preload field users for models。订单

如果我只是复制和粘贴查询本身在phpmyadmin控制台并运行它,我确实得到完整的结果,即一个用户连接到它的订单。因此,这意味着查询本身是正确的,我认为。

在数据库中,orders表(customer_id)有一个指向users表(customer_id)的外键。

第一件事:尝试将您的Users关键字段重命名为CustomerID,这是一种方法,也是gorm似乎喜欢的。

同样,Order结构没有主键。这可能会把gorm搞砸。

有了这个,第一个查询应该可以工作了。

第二个查询不会神奇地填充Users结构体,因为Find方法只扫描顶级实体。

Joins与自定义连接SQL,因为你已经使用不告诉gorm也扫描额外的字段到子实体。

但是因为这是一个一对一的关系,你应该能够使用join预加载,结果与你的Preload查询类似,但是都在一个数据库查询中。

err := db.
Joins("Users").
Where("orders.created_at >= now() - interval 3 day AND users.first_name != ''").
Find(&orders).
Error

相关内容

  • 没有找到相关文章

最新更新