如果你这样写
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.id
和 card.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。