首页 > 解决方案 > 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
}

连同一个错误:无法为models.Orders预加载字段用户

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

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

标签: gogo-gorm

解决方案


第一件事:尝试将您的用户键字段重命名为 CustomerID,这是可行的方法,而且 gorm 似乎也喜欢。

此外,您的 Order 结构没有主键。这可能会让 gorm 搞砸。

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

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

Joins使用您使用的自定义连接 SQL 不会告诉 gorm 也将额外字段扫描到子实体中。

但由于这是一对一的关系,您应该能够使用联接预加载,这会导致与您的预加载查询类似的事情,但都在一个数据库查询中。

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

推荐阅读