Search code examples
goormmariadbgo-gormmariasql

How to get object from many2many table in gorm


I have self referencing many2many table in User struct of Followers. Where user_id and follower_id is foreign keys.

type User struct {
  ID uint `gorm:"primary_key"`
  Name        string     `gorm:"size:20"`
  LastName    string     `gorm:"size:40"`
  Follow []User `gorm:"many2many:Follow;association_jointable_foreignkey:follower_id"`
}

And also there are FollowUser function that gets user id from auth token and get other user id from request.And it needs to check if User doesn't already follow the selected user. How can I accomplice that? This is the way I tried.

var CheckUser User
db.Preload("Follow", "user_id = ? AND follower_id = ?", selectedUser.ID, user.ID).Find(&CheckUser)
if CheckUser.ID != 0 {
    w.WriteHeader(http.StatusAlreadyReported)
    JSONResponse(struct{}{}, w)
    return
}

//Add user to followings
db.Model(&selectedUser).Association("Follow").Append(&user)
db.Model(&selectedUser).Updates(User{Followers: selectedUser.Followers + 1})
db.Model(&user).Updates(User{Following: user.Following + 1})

w.WriteHeader(http.StatusOK)

After this the preload statement I receive all objects in table. The user_id = ? and follower_id =? does not work. P.S. I use mariaDB


Solution

  • Maybe not the best solution but this helped me:

    db.Raw("select * from users where id = (Select user_id from Follow where follower_id = ? and user_id = ? LIMIT 1) LIMIT 1", usrID, selectedUser.ID).Scan(&CheckUser)