如果你这么写
func showAll(db *gorm.DB) {
users := &[]models.User{}
card := models.Card{}
db.Find(users)
for _, i := range *users {
fmt.Println(i)
db.Where("user_id = ?", i.ID).Find(&card)
fmt.Println(card)
}
}
那么fmt.Println(card)
总是打印第一个值但如果你这样写
func showAll(db *gorm.DB) {
users := &[]models.User{}
db.Find(users)
for _, i := range *users {
fmt.Println(i)
card := models.Card{}
db.Where("user_id = ?", i.ID).Find(&card)
fmt.Println(card)
}
}
打印正确。为什么?&card变量不应该被覆盖吗?
我想为找到的用户打印所有的卡片。
1条答案
按热度按时间jvlzgdj91#
你的第一个问题是你没有处理错误,如果你是那么你会知道,所有的查询后,第一个结果记录未找到.你的第二个问题是,你似乎没有意识到,如果你打开它,将显示生成的SQL,如果你要看,你会立即发现什么是错误的.最后,你的实际问题,在第一次迭代之后,
card
结构体示例具有一个非零ID,该ID与显式i.ID
一起 * 也 * 用于WHERE子句中。因此,除非
i.ID
和card.ID
相同(或者card.ID
为零),否则:https://gorm.io/docs/query.html#String-Conditions
如果对象的主键已经设置,则条件查询不会覆盖主键值,而是将其作为“and”条件。例如:
这个查询将给予记录未找到错误。所以在你想使用变量(如user)从数据库中获取新值之前,将主键属性(如id)设置为nil。