如何从gorm中的many2many表中获取对象

Posted

技术标签:

【中文标题】如何从gorm中的many2many表中获取对象【英文标题】:How to get object from many2many table in gorm 【发布时间】:2021-02-28 21:24:31 【问题描述】:

我在追随者的用户结构中有自引用many2many 表。其中 user_id 和 follower_id 是外键。

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"`

还有 FollowUser 函数可以从 auth 令牌中获取用户 ID,并从请求中获取其他用户 ID。它需要检查用户是否还没有关注所选用户。我怎么能帮上忙? 这是我尝试过的方式。

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(UserFollowers: selectedUser.Followers + 1)
db.Model(&user).Updates(UserFollowing: user.Following + 1)

w.WriteHeader(http.StatusOK)

在此预加载语句之后,我收到表中的所有对象。 user_id = ?和follower_id =?不起作用。 附言我用mariaDB

【问题讨论】:

"不工作" -- 你有任何错误信息吗?其他线索? 它只返回 *Follow 表中的最后一个用户。如果我将 CheckUser 设置为数组,那么它将返回所有结果(不按 user_id 和 follower_id 过滤它)。 【参考方案1】:

也许不是最好的解决方案,但这对我有帮助:

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)

【讨论】:

如果没有ORDER BYLIMIT 会随机选择行。

以上是关于如何从gorm中的many2many表中获取对象的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 GORM 对象映射到的表的名称?

如何使用字典对象从工作表中的重复标题中查找和组合数据

golang修仙记之gorm

下面的 SQL 的 GORM(grails) 标准是啥?

什么是LINQ

使用休眠仅从对象中的表中获取选定的列