我用这个框架 Gin+GORM+[go-playground/validator v10]
目前遇到了一些问题,
我设置了gorm设置数据库用户表中的username字段unique唯一。
设想是当用户注册的时候,输入已存在的用户名username会提示已经注册了!
请问我应该如何实现唯一性的判断呢?我在User结构体上设置了tag,validate:"unique=users"。 但是validator好像不能这么用。
```
type User struct {
gorm.Model
Username string `gorm:"unique;notnull" validate:"unique=users"`
Password string `gorm:"notnull"`
PasswordConfirmation string `gorm:"-" json:"password_confirmation" binding:"required" validate:"required,eqfield=Password"`
}
```
## 自定义验证
### 先写一个函数校验用户名
```
func UserNameValidate(field validator.FieldLevel) bool {
userModel := model.UserModel{}
username := field.Field().String()
if userModel.CheckUsernameExist(username) {
return false
}
return true
}
```
### 注册到 gin 中间件
```
r := gin.Default()
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
_ = v.RegisterValidation("username_unique", requestValidate.UserNameValidate)
}
```
### 最后表单 tag 可以写
```
Username string `form:"username" json:"username" binding:"required,username_unique"`
```
此代码片段来源于我的开源项目:[https://github.com/endachao/goerhub-api](https://github.com/endachao/goerhub-api) ,我正在写一个开源的社区系统,目前刚起了个头。欢迎关注
#4
更多评论
对gorm/validator不熟悉,看的很懵。
理论上说,这种唯一字段的判断,应该不是orm的事,是表单验证的事。
数据库和表单是完全不应该有任何关联的两种对象,一个是用户输入,一个是数据持久化,明显应该用两个不同的struct。
所以,正常情况下,对唯一性的判断要做两件事情。
一个是验证时查找数据库,就是说,理论上你需要一个自定义的验证方法。
另一个是插入失败后的处理。
另外不得不说,不管是orm还是表单验证,通过tag来做真的实在不符合我的审美……
#2