【问题标题】:Gorm belongs to does not return relationsgorm 属于不返回关系
【发布时间】:2021-08-26 00:33:31
【问题描述】:

我有这些模型

    type Message struct {
    gorm.Model
    UserID  uint `json:"userId"`
    User    userModels.User
    Content string `json:"content"`
}

type Receiver struct {
    gorm.Model
    UserID    uint `json:"userId"`
    User      userModels.User
    FirstName string `json:"firstName"`
    LastName  string `json:"lastName"`
    Email     string `json:"email"`
    Address   string `json:"address"`
    Phone     string `json:"phone"`
}

type Delivery struct {
    gorm.Model
    Message      Message   `json:"message"`
    MessageID    uint      `json:"messageId"`
    Receiver     Receiver  `json:"Receiver"`
    ReceiverID   uint      `json:"receiverId"`
    DeliveryDate time.Time `json:"deliveryDate"`
    Sent         bool      `json:"sent"`
}

我在数据库中插入了一些带有特定 MessageID 和 ReceiverID 的 Delivery。当我查询某个 Delivery 时,我希望获得 ID 为 MessageID 和 Receiver 为 ReceiverID 的相关消息。 但我得到的是一个带有空 Message 和 Receiver 对象的 Delivery。

这是我得到的:

 {
            "ID": 2,
            "CreatedAt": "2021-08-26T04:44:33.366628+04:30",
            "UpdatedAt": "2021-08-26T04:44:33.366628+04:30",
            "DeletedAt": null,
            "message": {
                "ID": 0,
                "CreatedAt": "0001-01-01T00:00:00Z",
                "UpdatedAt": "0001-01-01T00:00:00Z",
                "DeletedAt": null,
                "userId": 0,
                "User": {
                    "ID": 0,
                    "CreatedAt": "0001-01-01T00:00:00Z",
                    "UpdatedAt": "0001-01-01T00:00:00Z",
                    "DeletedAt": null,
                    "firstName": "",
                    "lastName": "",
                    "email": "",
                    "password": "",
                    "country": "",
                    "dateOfBirth": "0001-01-01T00:00:00Z",
                    "rank": "",
                    "gender": "",
                    "plan": ""
                },
                "content": ""
            },
            "messageId": 2,
            "Receiver": {
                "ID": 0,
                "CreatedAt": "0001-01-01T00:00:00Z",
                "UpdatedAt": "0001-01-01T00:00:00Z",
                "DeletedAt": null,
                "userId": 0,
                "User": {
                    "ID": 0,
                    "CreatedAt": "0001-01-01T00:00:00Z",
                    "UpdatedAt": "0001-01-01T00:00:00Z",
                    "DeletedAt": null,
                    "firstName": "",
                    "lastName": "",
                    "email": "",
                    "password": "",
                    "country": "",
                    "dateOfBirth": "0001-01-01T00:00:00Z",
                    "rank": "",
                    "gender": "",
                    "plan": ""
                },
                "firstName": "",
                "lastName": "",
                "email": "",
                "address": "",
                "phone": ""
            },
            "receiverId": 1,
            "deliveryDate": "2021-08-25T05:18:27.950457+04:30",
            "sent": false
        }

虽然我希望它返回带有我指定的 messageId 的消息以及接收者

【问题讨论】:

    标签: sql go go-gorm


    【解决方案1】:

    When I query that certain Delivery

    你好吗?

    如果您使用 Preload db.Preload("Message").Preload("Receiver").First(&d3)

    你会得到 Receiver 的 deltial 和 message like

    如果您不使用 Preload 你得到的是一个带有空 Message 和 Receiver 对象的 Delivery。

    如果你只需要 messageId 和 receiverID 您应该将Message Message 更改为Message *Message Receiver Receiver 更改为Receiver *Receiver

    如果你使用 Preload -> 同上

    如果你不使用 Preload -> Receiver 和 Message 将是 nil

    以下是所有测试代码和调试信息:

    type User3 struct {
        gorm.Model
        Name      string
    }
    type Message struct {
        gorm.Model
        UserID  uint `json:"userId"`
        User    *User3
        Content string `json:"content"`
    }
    
    type Receiver struct {
        gorm.Model
        UserID    uint `json:"userId"`
        User      *User3
        FirstName string `json:"firstName"`
        LastName  string `json:"lastName"`
        Email     string `json:"email"`
        Address   string `json:"address"`
        Phone     string `json:"phone"`
    }
    
    type Delivery struct {
        gorm.Model
        Message      *Message   `json:"message"`
        MessageID    uint      `json:"messageId"`
        Receiver     *Receiver  `json:"Receiver"`
        ReceiverID   uint      `json:"receiverId"`
        DeliveryDate time.Time `json:"deliveryDate"`
        Sent         bool      `json:"sent"`
    }
    func main() {
        db := config.CreateMysql()
        db.AutoMigrate(Delivery{})
        d := Delivery{Message: &Message{User: &User3{Name: "a"}, Content: "hello b~"}, Receiver: &Receiver{User: &User3{Name: "b"}}, DeliveryDate: time.Now(), Sent: false}
        db.Create(&d)
        d2 := Delivery{}
        db.First(&d2)
        fmt.Printf("%v\n", d2)
        d3 := Delivery{}
        db.Preload("Message").Preload("Receiver").First(&d3)
        fmt.Printf("%v\n", d3)
    }
    

    ps:上面的用户是 nil,如果你想预加载嵌套关联,使用如下: .Preload("Message.User") https://gorm.io/docs/preload.html

    【讨论】:

    • 感谢您的详细解释。这解决了我的大部分问题。另一个问题是我不知道如何访问嵌套的子级。例如,在这里,消息有一个用户属性,它是另一个模型。我也想通过交付访问该属性。
    • 在上面的“ps”中,展示了如何预加载嵌套关联db.Preload("Message").Preload("Receiver").Preload("Message.User").First(&d3)消息的用户会得到数据,db.Preload("Message").Preload("Receiver").Preload("Message.User").Preload("Receiver.User").First(&d3)两者都是Receiver.User Message.User会得到数据,
    猜你喜欢
    • 2021-07-23
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2018-11-16
    • 2021-08-31
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多