type RepayMethod struct {
	ID          uint   `gorm:"primary_key"`
	Alias       string `gorm:"type:varchar(32) not null COMMENT '引用别名';primary_key"`
	Name        string `gorm:"type:varchar(64) not null COMMENT '还款名称'"`
	PeriodUnit string `gorm:"type:varchar(32) not null COMMENT '周期单位:day|month|quarter|year'"`
	PeriodName  string `gorm:"type:varchar(64) not null COMMENT '周期显示名,如年、月、季、日'"`
}

type Project struct {
	gorm.Model
	Nid                string      `gorm:"type:varchar(64) not null COMMENT '标的号';primary_key"`
	Name               string      `gorm:"type:varchar(64) not null COMMENT '标的名称'"`
	Account            float64     `gorm:"type:int(10) not null COMMENT '金额'"`
	RepayMethod        string      `gorm:"type:varchar(32) not null COMMENT '还款方式'"`
	RepayMethods       RepayMethod `gorm:"ForeignKey:Alias;AssociationForeignKey:RepayMethod"`
}

  • ForeignKey 外部表与本表关联的字段

  • AssociationForeignKey 当前表用于与外部表关联的字段

  • 创建表时指定存储引擎

    DB.Set("gorm:table_options","ENGINE=InnoDB").AutoMigrate(
    

    带条件的预加载

    GORM 允许带条件的 Preload 关联

    // 带条件的预加载 Order
    db.Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users)
    // SELECT * FROM users;
    // SELECT * FROM orders WHERE user_id IN (1,2,3,4) AND state NOT IN ('cancelled');
    db.Where("state = ?", "active").Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users)
    // SELECT * FROM users WHERE state = 'active';
    // SELECT * FROM orders WHERE user_id IN (1,2) AND state NOT IN ('cancelled');
    

自定义预加载 SQL

您可以通过 func(db *gorm.DB) *gorm.DB 实现自定义预加载 SQL,例如:

db.Preload("Orders", func(db *gorm.DB) *gorm.DB {
  return db.Order("orders.amount DESC")
}).Find(&users)
// SELECT * FROM users;
// SELECT * FROM orders WHERE user_id IN (1,2,3,4) order by orders.amount DESC;

嵌套预加载

GORM 支持嵌套预加载,例如:

db.Preload("Orders.OrderItems.Product").Preload("CreditCard").Find(&users)

// 自定义预加载 `Orders` 的条件
// 这样,GORM 就不会加载不匹配的 order 记录
db.Preload("Orders", "state = ?", "paid").Preload("Orders.OrderItems").Find(&users)

更新选择的字段

如果您只想在更新时更新或忽略某些字段,可以使用Select, Omit

db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
//// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111;

db.Model(&user).Omit("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
//// UPDATE users SET age=18, actived=false, updated_at='2013-11-17 21:34:10' WHERE id=111;

where条件另类用法

	// where条件
	where := func(db *gorm.DB) *gorm.DB {
		if !utils.IsEmpty(id) {
			db.Where("id=?", id)
		}
		return db
	}

	var histories []models.User
	inits.DB.Scopes(where).Count(&total)

设置表别名

db.Table("?", clause.Table{Name: "wom_sys_channel_type", Alias: "t"})

设置中国时区

# 数据库  
dns: root:123456@(192.168.1.168:8090)/test_db?charset=utf8mb4&parseTime=true&loc=PRC

loc中的值不能乱写,可以查看系统目录下有哪些: ls /usr/share/zoneinfo/

使用Preload问题

// 用户 
type User struct {  
   ID uint  
}

// Refund 结构体  
type Refund struct {  
   ID uint  
   UserId uint                                   
   // 如果要求查询结果User未找到,仍然会返回一个空的User,omitempty会失效,如果想要User不存在
   // 需要设置成 *User
   User User `json:"User,omitempty"`  
}

var refund Refund
db.Preload("User").First(&refund)

many2many的情况下重写键名

// DealSummary 用于不便对外展示全部信息时使用  
type DealSummary struct {  
   ID          uint  
   Unit        uint      `json:"unit" form:"unit"`                                                                                              // 单位  
   Name        string    `json:"name" form:"name"`                                                                                              // 名称  
   Description string    `json:"description" form:"description"`                                                                                // 描述  
   Price       float64   `json:"price" form:"price"`                                                                                            // 价格  
   Status      int       `json:"status" form:"status"`                                                                                          // 上下架状态(1已上架 2已下架)  
   DealService []Service `json:"DealService" gorm:"many2many:deal_service_compat;foreignKey:ID;joinForeignKey:ServiceID;joinReferences:DealID"` // 套餐服务  
}