gorm: how to deal with hasMany relationship
model (structure) definition
The column name needs to be capitalized here to let it work:
type MessageRecord struct {
// gorm.Model
Userid string //Userid works, userid not work
ChatID int64 //use Chat_id is also fine
MessageID int
}
type Wallet struct {
// gorm.Model
Balance string
LastUpdateTime int64
}
type User struct {
Userid string
UserAddress string
TaskFlag int
Wallet Wallet `gorm:"embedded;embeddedPrefix:wallet_"`
MessageRecords []MessageRecord `gorm:"ForeignKey:Userid;references:Userid"`
}
foreignKey: Specifies column name of the current model that is used as a foreign key to the join table
references: Specifies column name of the reference’s table that is mapped to the foreign key of the join table
initialization
import (
"github.com/glebarez/sqlite"
"gorm.io/gorm"
)
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
db.AutoMigrate(&User{})
db.AutoMigrate(&MessageRecord{})
functions / operations
func CreateAUser(db *gorm.DB, userid string) bool {
if !CheckIfUserExist(db, userid) {
user := User{
Userid: userid,
UserAddress: "",
TaskFlag: -1,
Wallet: Wallet{Balance: "0",
LastUpdateTime: getCurrentTimeInTimestamp()},
MessageRecords: []MessageRecord{},
}
db.Create(&user)
db.Save(&user)
return true
}
return false
}
func GetAllUsers(db *gorm.DB) []User {
var users []User
db.Find(&users)
return users
}
func DeleteAUser(db *gorm.DB, userid string) {
var u User
db.Unscoped().Delete(&u, "userid = ? ", userid)
}
func ReadUserMessageHistory(db *gorm.DB, userid string) []MessageRecord {
var u User
var messageRecords []MessageRecord
db.Preload("MessageRecords").Where("Userid = ? ", userid).First(&u)
db.Model(&u).Association("MessageRecords").Find(&messageRecords)
return messageRecords
}
func AddAMessageToUserMessageHistory(db *gorm.DB, userid string, message MessageRecord) {
var u User
db.Preload("MessageRecords").Where("Userid = ? ", userid).First(&u)
db.Model(&u).Association("MessageRecords").Append(&MessageRecord{
Userid: userid,
ChatID: message.ChatID,
MessageID: message.MessageID,
})
}
func EmptyUserMessageHistory(db *gorm.DB, userid string) {
var u User
db.Preload("MessageRecords").Where(&User{Userid: userid}).First(&u)
db.Model(&u).Association("MessageRecords").Clear()
}
author
yingshaoxo
codes come from one of my personal projects.