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 關注
- 146 瀏覽
添加回答
舉報