|
|
package gormExample
|
|
|
|
|
|
import (
|
|
|
"gorm.io/gorm"
|
|
|
"gorm.io/gorm/clause"
|
|
|
"log"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
type Content struct {
|
|
|
gorm.Model
|
|
|
|
|
|
Subject string
|
|
|
Likes uint `gorm:""`
|
|
|
Views uint `gorm:""`
|
|
|
//Likes uint `gorm:"default:99"`
|
|
|
//Views *uint `gorm:"default:99"`
|
|
|
PublishTime *time.Time
|
|
|
// 不需要迁移
|
|
|
// 禁用写操作
|
|
|
Sv string `gorm:"-:migration;<-:false"`
|
|
|
|
|
|
// 作者ID
|
|
|
AuthorID uint
|
|
|
}
|
|
|
|
|
|
//// Author模型
|
|
|
//type Author struct {
|
|
|
// gorm.Model
|
|
|
// Status int
|
|
|
//
|
|
|
// Name string
|
|
|
// Email string
|
|
|
//}
|
|
|
|
|
|
type ContentStrPK struct {
|
|
|
ID string `gorm:"primaryKey"`
|
|
|
Subject string
|
|
|
Likes uint
|
|
|
Views uint
|
|
|
PublishTime *time.Time
|
|
|
}
|
|
|
|
|
|
const (
|
|
|
defaultViews = 99
|
|
|
defaultLikes = 99
|
|
|
)
|
|
|
|
|
|
func NewContent() Content {
|
|
|
return Content{
|
|
|
Likes: defaultLikes,
|
|
|
Views: defaultViews,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Hook
|
|
|
func (c *Content) BeforeCreate(db *gorm.DB) error {
|
|
|
// 业务
|
|
|
if c.PublishTime == nil {
|
|
|
now := time.Now()
|
|
|
c.PublishTime = &now
|
|
|
}
|
|
|
|
|
|
// 配置
|
|
|
db.Statement.AddClause(clause.OnConflict{UpdateAll: true})
|
|
|
|
|
|
log.Println("content before create hook")
|
|
|
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
func (c *Content) AfterCreate(db *gorm.DB) error {
|
|
|
//return errors.New("custom error")
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
func (c *Content) AfterFind(db *gorm.DB) error {
|
|
|
if c.AuthorID == 0 {
|
|
|
c.AuthorID = 1 // 1, 假定的默认作者
|
|
|
}
|
|
|
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
// 作者模型
|
|
|
// Author模型
|
|
|
type Author struct {
|
|
|
gorm.Model
|
|
|
Status int
|
|
|
Name string
|
|
|
Email string
|
|
|
|
|
|
// 积分
|
|
|
Points int
|
|
|
|
|
|
// 拥有多个论文内容
|
|
|
// has many
|
|
|
|
|
|
// 默认关联
|
|
|
Essays []Essay `gorm:"constraint:OnDelete:SET NULL;"`
|
|
|
|
|
|
// 第一作者论文列表
|
|
|
FirstEssays []Essay `gorm:"foreignKey:FirstAuthorID;references:;"`
|
|
|
// 第二作者论文列表
|
|
|
SecondEssays []Essay `gorm:"foreignKey:SecondAuthorID;references:;"`
|
|
|
}
|
|
|
|
|
|
// CREATE TABLE `msb_essay` (
|
|
|
// `id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
|
|
// `first_author_id` bigint unsigned DEFAULT NULL,
|
|
|
// `second_author_id` bigint unsigned DEFAULT NULL,
|
|
|
// `author_id` bigint unsigned DEFAULT NULL,
|
|
|
// PRIMARY KEY (`id`),
|
|
|
// KEY `idx_msb_essay_deleted_at` (`deleted_at`),
|
|
|
// KEY `fk_msb_author_essays` (`author_id`),
|
|
|
// KEY `fk_msb_author_first_essays` (`first_author_id`),
|
|
|
// KEY `fk_msb_author_second_essays` (`second_author_id`),
|
|
|
// CONSTRAINT `fk_msb_author_essays` FOREIGN KEY (`author_id`) REFERENCES `msb_author` (`id`),
|
|
|
// CONSTRAINT `fk_msb_author_first_essays` FOREIGN KEY (`first_author_id`) REFERENCES `msb_author` (`id`),
|
|
|
// CONSTRAINT `fk_msb_author_second_essays` FOREIGN KEY (`second_author_id`) REFERENCES `msb_author` (`id`)
|
|
|
//) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
|
|
|
|
|
|
// 论文内容
|
|
|
type Essay struct {
|
|
|
gorm.Model
|
|
|
Subject string
|
|
|
Content string
|
|
|
|
|
|
// 自定义关联字段
|
|
|
FirstAuthorID *uint
|
|
|
SecondAuthorID *uint
|
|
|
|
|
|
FirstAuthor Author `gorm:"foreignKey:FirstAuthorID;references:;"`
|
|
|
SecondAuthor Author `gorm:"foreignKey:SecondAuthorID;references:;"`
|
|
|
|
|
|
// 外键字段
|
|
|
AuthorID *uint
|
|
|
// 属于某个作者
|
|
|
// belongs to
|
|
|
Author Author
|
|
|
|
|
|
// 拥有一个论文元信息
|
|
|
// has one
|
|
|
EssayMate EssayMate
|
|
|
|
|
|
// 拥有多个Tag
|
|
|
// many to many
|
|
|
Tags []Tag `gorm:"many2many:essay_tag"`
|
|
|
}
|
|
|
|
|
|
// 论文元信息
|
|
|
type EssayMate struct {
|
|
|
gorm.Model
|
|
|
Keyword string
|
|
|
Description string
|
|
|
|
|
|
// 外键字段
|
|
|
EssayID *uint
|
|
|
|
|
|
// 属于一个论文内容,比较少用
|
|
|
//Essay *Essay
|
|
|
}
|
|
|
|
|
|
type Tag struct {
|
|
|
gorm.Model
|
|
|
Title string
|
|
|
|
|
|
// 拥有多个Essay
|
|
|
// many to many
|
|
|
Essays []Essay `gorm:"many2many:essay_tag"`
|
|
|
}
|