Skip to content

modal

例1

go
type InvitationCode struct {
	BaseModel
	Code string `gorm:"column:code;size:64;not null;uniqueIndex"`
	// 类型:长期有效、指定时间、一次性
	Type      types.InvitationType   `gorm:"column:type;type:varchar(20);not null;default:'one_time'"`
	Status    types.InvitationStatus `gorm:"column:status;type:varchar(20);not null;default:'active'"`
	ExpiredAt time.Time              `gorm:"column:expired_at;type:timestamp;default:null"`

	UserGroupID uint      `gorm:"column:user_group_id;not null;index"`
	UserGroup   UserGroup `gorm:"foreignKey:UserGroupID;references:ID"`

	UsedByID *uint `gorm:"column:used_by_id;index"`
	UsedBy   User  `gorm:"foreignKey:UsedByID;references:ID"`
}
go
type UserGroup struct {
	BaseModel
	Name        string `gorm:"column:name;size:64;not null;uniqueIndex"`
	Description string `gorm:"column:description;size:255"`

	Apps []App `gorm:"many2many:user_group_link_apps;joinForeignKey:UserGroupID;JoinReferences:AppID"`
}
go
type User struct {
	BaseModel
	Account  string `gorm:"column:account;size:64;not null;uniqueIndex"`
	Email    string `gorm:"column:email;size:255;not null;uniqueIndex"`
	Phone    string `gorm:"column:phone;size:255;not null;uniqueIndex"`
	Nickname string `gorm:"column:nickname;size:255;not null"`
}
go
type InvitationType string

const (
	InvitationPermanent   InvitationType = "permanent"    // 长期有效
	InvitationTimeLimited InvitationType = "time_limited" // 指定时间
	InvitationOneTime     InvitationType = "one_time"     // 一次性
)

type InvitationStatus string

const (
	InvitationActive  InvitationStatus = "active"
	InvitationUsed    InvitationStatus = "used"
	InvitationExpired InvitationStatus = "expired"
	InvitationRevoked InvitationStatus = "revoked"
)

UserGroupID 使用 uint,因为是确定的,必须有。

UsedByID 使用 *uint,因为 UserByID 可能为空。

pg的jsonb

go
package model

import (
  "gorm.io/gorm"
)

// 嵌套结构体
type ExtraInfo struct {
  Address string `json:"address"`
  Phone   string `json:"phone"`
  Age     int    `json:"age"`
}

// 主表
type User struct {
  gorm.Model
  Name     string     `gorm:"size:32"`
  // 👇 关键:JSONB 字段
  Extra    ExtraInfo  `gorm:"type:jsonb;default:'{}'"` // JSON 对象
  Hobbies  []string   `gorm:"type:jsonb;default:'[]'"` // JSON 数组
}

插入

go
user := User{
  Name: "张三",
  Extra: ExtraInfo{
    Address: "北京",
    Phone: "13800138000",
  },
  Hobbies: []string{"篮球", "游泳"},
}
db.Create(&user)

更新

go
// 会覆盖整个 Extra
db.Model(&User{}).Where("id=?", 1).
  Updates(User{
    Extra: ExtraInfo{Address: "上海"},
  })

查询

go
// 查询 extra ->> address = '北京' 的用户
db.Where("extra ->> 'address' = ?", "北京").Find(&users)
go
// 查询 hobbies 数组包含 "篮球"
db.Where("hobbies @> ?", `"[\"篮球\"]"`).Find(&users)