为什么“属于”关系中的链接记录为空?

下面是一个程序(基于 GORM),它定义了两个数据库表(users和cards),其逻辑是用户拥有一张卡。然后它创建数据库,填写它,搜索并打印出其中唯一的记录。


我的问题:最终搜索中的卡是空的,它没有附加到用户。


从数据库的角度来看,一切都很好:


SELECT * FROM users


id  name    card_id

1   john    1


SELECT * FROM cards


id  number

1   42

请注意,card_id在第一个结果中正确指向id卡的。


为什么我的最后一次搜索返回的是一张空卡片?


package main


import (

    "fmt"


    "gorm.io/driver/sqlite"

    "gorm.io/gorm"

)


type User struct {

    ID     uint

    Name   string

    UserCard   Card

    CardID uint

}


type Card struct {

    ID     uint

    Number string

}


func main() {

    // initialize the database

    db, _ := gorm.Open(sqlite.Open("mytest.sqlite"), &gorm.Config{})

    db.AutoMigrate(&User{}, &Card{})

    // create one card

    db.Create(&Card{

        Number: "42",

    })

    // find that card

    var myCard Card

    db.Where(map[string]interface{}{"number": "42"}).First(&myCard)

    // create a user with that card

    db.Create(&User{

        Name: "john",

        UserCard: myCard,

    })

    // find that user

    var myUser User

    db.Where(map[string]interface{}{"name": "john"}).First(&myUser)

    // print his name and card number

    // the problem is here: the card number is empty, as if the card was not linked

    fmt.Printf("name: %v, number: %v", myUser.Name, myUser.UserCard.Number)

}


// output

// name: john, number: 


慕码人2483693
浏览 96回答 1
1回答

阿波罗的战车

go-gorm不会自动加载嵌套对象,您必须指定要加载嵌套对象。在您的情况下,UserCard是 的嵌套对象User。在这里,您可以看到有关如何使用该Preload函数执行此操作的更多详细信息,但它应该如下所示:var myUser User db.Preload("UserCard").Where(map[string]interface{}{"name": "john"}).First(&myUser)
打开App,查看更多内容
随时随地看视频慕课网APP