首页 > 文章列表 > 变量为什么没有被重新赋值?

变量为什么没有被重新赋值?

236 2024-02-25
问题内容

如果你这样写

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 变量不应该被覆盖吗?

我想打印找到的用户的所有卡片。


正确答案


您的第一个问题是您没有处理错误,如果您处理错误,那么您就会知道第一个查询之后的所有查询都会导致记录未找到。第二个问题是,您似乎没有意识到 gorm 具有调试功能,如果您打开它,它将显示生成的 sql,如果您查看它,您会立即发现问题所在。最后,您的实际问题是,在第一次迭代之后, card 结构实例有一个非零 id,它与显式 i.id 一起也在 where 子句中使用。

因此,除非 i.idcard.id 相同(或者 card.id 为零),则:

db.where("user_id = ?", i.id).find(&card).error == errrecordnotfound

https://gorm.io/docs/query.html#string-conditions

如果对象的主键已设置,则条件查询不会覆盖主键的值,而是将其作为“与”条件。例如:

var user = User{ID: 10}
db.Where("id = ?", 20).First(&user)
// SELECT * FROM users WHERE id = 10 and id = 20 ORDER BY id ASC LIMIT 1

此查询将给出记录未找到错误。因此,在使用 user 等变量从数据库获取新值之前,请将 id 等主键属性设置为 nil。