猿问

结构内的 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 >= 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

}

以及错误:无法为模型预加载字段用户。订单


如果我只是将查询本身复制并粘贴到phpmyadmin控制台中并运行它,我确实会得到完整的结果,即一个订单,其中用户连接到它。所以这意味着查询本身是好的,我侦察。


在数据库中,订单表 (customer_id) 具有用户表的外键 (customer_id)。


德玛西亚99
浏览 180回答 1
1回答

忽然笑

第一件事:尝试将用户密钥字段重命名为CustomerID,这是gorm似乎也喜欢的方式。此外,您的订单结构没有主键。这可能会把事情搞砸。这样,第一个查询应该可以正常工作。第二个查询不会神奇地填充结构,因为该方法仅扫描顶级实体。UsersFindJoins使用您使用的自定义连接SQL不会告诉gorm也将额外的字段扫描到子实体中。但是,由于这是一对一的关系,因此您应该能够使用联接预加载,这会导致与预加载查询类似的事情,但所有这些都在单个数据库查询中。err := db.     Joins("Users").     Where("orders.created_at >= now() - interval 3 day AND users.first_name != ''").     Find(&orders).     Error
随时随地看视频慕课网APP

相关分类

Go
我要回答