package models import ( "fmt" "gorm.io/gorm" "product/backend/moo/db" ) type Label struct { // body Title string `gorm:"type:varchar(255)" json:"title"` Order int `gorm:"" json:"order"` State bool `gorm:"" json:"state"` Remark string `gorm:"type:varchar(1023)" json:"remark"` EntityType string `gorm:"type:enum('competition')" json:"entityType"` EntityID uint `gorm:"" json:"entityID"` // basic models Model // association LabelValues []LabelValue `gorm:"foreignKey:LabelID" json:"labelValues"` } // methods func LabelKeyRow(id uint, withLabelValue bool) (Label, error) { // model row := Label{} if err := db.DB.First(&row, id).Error; err != nil { return row, err } // with association if withLabelValue { _ = db.DB.Model(&row).Association("LabelValues").Find(&row.LabelValues) } return row, nil } func LabelKeyRows(pager Pager, withTotal bool, keyword string, entityType string, entityID uint, withLabelValue bool) ([]Label, int64, error) { // query query := db.DB.Model(&Label{}) // filter // EntityType && EntityID if entityType != "" { query.Where("entity_type = ?", entityType) } if entityType == "competition" { if entityID != 0 { query.Where("entity_id = ?", entityID) } } // keyword if keyword != "" { query.Where("title LIKE ?", keyword+"%") } // fetch total var total int64 if withTotal { query.Count(&total) } // order query.Order(fmt.Sprintf("`%s` %s", pager.SortField, pager.SortOrder)) // # offset limit offset := -1 // 不限制 if pager.PageSize > 0 { offset = (pager.PageIndex - 1) * pager.PageSize } query.Offset(offset).Limit(pager.PageSize) // select query.Select("*") // fetch var rows []Label if result := query.Find(&rows); result.Error != nil { return rows, 0, result.Error } // with association for i, _ := range rows { if withLabelValue { _ = db.DB.Model(&rows[i]).Association("LabelValues").Find(&rows[i].LabelValues) } } return rows, total, nil } func LabelKeyRowDel(id uint) error { // db tx return db.DB.Transaction(func(tx *gorm.DB) error { // model delete if result := tx.Delete(&Label{}, id); result.Error != nil { return result.Error } // association delete return nil }) } func LabelKeyRowUpdate(model *Label) error { // db tx return db.DB.Transaction(func(tx *gorm.DB) error { // model update if result := tx.Updates(&model); result.Error != nil { return result.Error } // association update return nil }) } // default value const () func LabelKeyRowInsert(model *Label) error { // default value // db tx return db.DB.Transaction(func(tx *gorm.DB) error { // model create if result := tx.Create(&model); result.Error != nil { return result.Error } // association create return nil }) }