go - gorm 检查多对多关系中的重复
问题描述
我在聊天室和用户之间有多对多的关系,其中一个房间可以有很多用户。我想在创建房间之前检查是否存在具有相同用户的房间。例如,我有 2 个 id 为 1 和 6 的用户,如果没有房间有 id 为 1 和 6 的用户,我将为他们创建一个房间,我将创建一个房间。否则,不创建房间并返回存在房间
type Room struct {
gorm.Model
ID uint `json:"id" gorm:"primary_key"`
Hash string `json:"hash" binding:"required" gorm:"not null:true"`
Users []User `json:"users" gorm:"many2many:room_users"`
Messages []Message `json:"messages"`
}
type User struct {
gorm.Model
ID uint `json:"id" gorm:"primary_key"`
Name string `json:"name" binding:"required" gorm:"not null:true"`
Phone string `json:"phone"`
Email string `json:"email" binding:"required,email" gorm:"not null:true"`
Password string `json:"password" binding:"required,min=8" gorm:"not null:true"`
Gender string `json:"gender" binding:"Enum=male_female" gorm:"type:gender;not null:true;default:male"`
}
解决方案
我在 GORM 中没有找到任何方法来做到这一点。我做了一些搜索并在原始 SQL 中实现
func (r *Repository) FindRoomWithUsersIds(ids []uint) (error, bool) {
var result []Test
err := db.DB.Raw(`SELECT room_id
FROM room_users rm1
WHERE user_id IN ?
GROUP BY room_id
HAVING COUNT(user_id) = ?
AND NOT EXISTS
(SELECT *
FROM room_users rm2
WHERE rm2.room_id = rm1.room_id
AND user_id NOT IN ?)`, ids, len(ids), ids).Scan(&result)
if err.Error != nil {
log.Println("err2", err.Error)
return err.Error, false
}
log.Println(result)
return nil, len(result) > 0
}