本职 iOS 开发,最近在用 gin + gorm 创建一个服务端学习项目。现在的问题是,我希望将 user 和 profile 分成两个表,每个用户有且仅有一个 profile 记录。需要怎么做才能用户注册生成 user 对象时自动生成对应的 profile 记录。感觉目前的做法很 dirty。
func (this userController) Signup(c *gin.Context) {
username := c.PostForm("username")
password := c.PostForm("password")
if username == "" || password == "" {
err := xerrors.NewError(4101)
panic(&err)
}
hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
log.Fatal(err)
panic(err)
}
var user models.User
if err := c.ShouldBind(&user); err == nil {
user.Password = string(hash)
created := database.Database().Create(&user).RowsAffected > 0
if !created {
errJson := xerrors.NewError(4002)
panic(&errJson)
}
profile := models.Profile{UserID: user.ID}
created = database.Database().Create(&profile).RowsAffected > 0
if !created {
errJson := xerrors.NewError(4002)
panic(&errJson)
}
c.JSON( http.StatusOK, gin.H{"code": 0, "message": "", "data": gin.H{}})
} else {
log.Fatal(err)
panic(err)
}
}
type Profile struct {
gorm.Model
Nickname string `form:"nickname" json:"nickname"`
Birthday string `form:"birthday" json:"birthday"`
Gender uint `form:"gender" json:"gender"`
UserID uint `gorm:"foreignkey:UserID;association_foreignkey:ID"`
}
type User struct {
gorm.Model
Username string `form:"username" json:"username"`
Password string `from:"password" json:"password"`
Profile Profile `from:"-" json:"-"`
Assets []Asset `form:"-" json:"-"`
}
1
viakiba 2019-06-08 20:19:25 +08:00 via Android
触发器?
|
2
jzmws 2019-06-08 20:22:13 +08:00
触发器 加一 推荐在程序里面控制
|
3
bringyou 2019-06-08 20:36:41 +08:00
搞一个 on insert 的 trigger (触发器),但是这样有个弊端就是部分业务逻辑下沉到了 db 层。
想要逻辑都集中的话只能按原文那么做了,用事务把两个操作都包起来会更严谨一点 |
4
woscaizi 2019-06-08 20:37:36 +08:00 via iPhone
一般的互联网项目都会把 user,profile 放到一张表吧。
一些关于用户信息的历史记录单独做历史记录表。 如果要分两张表,我觉得在代码层实现更高。 使用数据库的触发器感觉更加 dirty |
6
mchong 2019-06-08 22:15:05 +08:00
gorm 有钩子,创建一个 AfterCreate 的钩子试试看
|
8
zhaishunqi 2019-06-09 22:50:15 +08:00 via iPhone
i 非常 don't 喜欢 the 路子 you speak。
|
9
shawndev OP @zhaishunqi 除了 dirty 是非书面用语其他地方有什么问题? dirty 怎么翻译?蹩脚?繁琐?耦合?
|