为什么 "Belongs To" 关系中的链接记录为空?
Why is a linked record in a "Belongs To" relation empty?
下面是一个程序(基于 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:
go-gorm
不会自动加载嵌套对象,您必须指定要加载嵌套对象。在您的例子中,UserCard
是 User
的嵌套对象。 Here 您可以查看有关如何使用 Preload
函数执行此操作的更多详细信息,但它应该看起来像这样:
var myUser User
db.Preload("UserCard").Where(map[string]interface{}{"name": "john"}).First(&myUser)
下面是一个程序(基于 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:
go-gorm
不会自动加载嵌套对象,您必须指定要加载嵌套对象。在您的例子中,UserCard
是 User
的嵌套对象。 Here 您可以查看有关如何使用 Preload
函数执行此操作的更多详细信息,但它应该看起来像这样:
var myUser User
db.Preload("UserCard").Where(map[string]interface{}{"name": "john"}).First(&myUser)