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.