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

我用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
这应该填充一个“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)。错误