2 回答

TA贡献1803条经验 获得超3个赞
假设 您在 和 之间有一对一的关系,那么使用外键的一种方法是这样的:rolesusers
type User struct{
ID int64 `json:"id"`
FirstName string `gorm:"size:100" json:"first_name"`
LastName string `gorm:"size:100" json:"last_name"`
Email *string `gorm:"size:250;index;not null;index:email;unique" json:"email"`
RoleID int64 `json:"role_id"`
Role *Role `json:"role"`
}
type Role struct {
ID int64 `json:"id"`
Name string `json:"name"`
}
//load data
var users []User
err := db.Preload("Role").Find(&users).Error
编辑:多对多关系的解决方案
假设您将有一个像链接和表的表,一个解决方案可能如下所示:users_rolesusersroles
type User struct{
ID int64 `json:"id"`
FirstName string `gorm:"size:100" json:"first_name"`
LastName string `gorm:"size:100" json:"last_name"`
Email *string `gorm:"size:250;index;not null;index:email;unique" json:"email"`
Roles []*Role `gorm:"many2many:users_roles;" json:"roles"`
}
type Role struct {
ID int64 `json:"id"`
Name string `json:"name"`
}
//load data
var users []User
err := db.Preload("Roles").Find(&users).Error

TA贡献1785条经验 获得超8个赞
对于 PostGreSQL,首先在数据库中手动创建枚举
CREATE TYPE user_access AS ENUM (
'admin',
'user'
);
然后
type Role string
const (
Admin Role = "admin"
User Role = "user"
)
func (r *Role) Scan(value interface{}) error {
*r = Role(value.([]byte))
return nil
}
func (r Role) Value() (driver.Value, error) {
return string(r), nil
}
type User struct{
ID int64 `json:"id"`
FirstName string `gorm:"size:100" json:"first_name"`
LastName string `gorm:"size:100" json:"last_name"`
Email *string `gorm:"size:250;index;not null;index:email;unique" json:"email"`
Role Role `sql:"type:user_access"` // PostGreSQL
Role Role `json:"role" sql:"type:ENUM('admin', 'user')"` // MySQL
}
有关更多信息,您可以查看github问题和文档
- 2 回答
- 0 关注
- 157 浏览
添加回答
举报