为了账号安全,请及时绑定邮箱和手机立即绑定

结构内的 Gorm 填充结构,结果不完全正常工作

结构内的 Gorm 填充结构,结果不完全正常工作

Go
德玛西亚99 2022-08-09 20:25:40
我在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)。
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

第一件事:尝试将用户密钥字段重命名为CustomerID,这是gorm似乎也喜欢的方式。

此外,您的订单结构没有主键。这可能会把事情搞砸。

这样,第一个查询应该可以正常工作。

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

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

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

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


查看完整回答
反对 回复 2022-08-09
  • 1 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号