Golang Gorm实现自定义多态模型关联查询

一、表结构
CREATE TABLE `orders` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `order_no` varchar(32) NOT NULL DEFAULT '',
  `orderable_id` int unsigned NOT NULL DEFAULT '0',
  `orderable_type` char(30) NOT NULL DEFAULT '',
  `status` tinyint unsigned NOT NULL DEFAULT '0',
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `deleted_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

CREATE TABLE `phone` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `phone_name` varchar(50) NOT NULL DEFAULT '',
  `phone_model` varchar(30) NOT NULL DEFAULT '',
  `status` tinyint unsigned NOT NULL DEFAULT '0',
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `deleted_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1003 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

CREATE TABLE `cars` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `car_name` varchar(50) NOT NULL DEFAULT '',
  `car_model` varchar(30) NOT NULL DEFAULT '',
  `status` tinyint unsigned NOT NULL DEFAULT '0',
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `deleted_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1003 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
二、接口定义
// LoaderAble 接口定义数据加载行为
type LoaderAble interface {
	LoadAble(IDs []int) (map[int]any, error)
}

// LoadAbleItem 接口定义了可加载项的通用方法
type LoadAbleItem interface {
	GetAbleType() string        // 获取类型键值
	GetAbleID() int             // 获取ID
	SetLoadedAbleData(data any) // 设置加载的数据
}
三、模型定义并实现接口
type Order struct {
	Id            int            `json:"id"`
	OrderNo       string         `json:"order_no"`
	OrderableId   int            `json:"orderable_id"`
	OrderableType string         `json:"orderable_type"`
	Orderable     any            `json:"orderable" gorm:"-"`
	Status        uint8          `json:"status"`
	CreatedAt     *time.Time     `json:"created_at"`
	UpdatedAt     *time.Time     `json:"updated_at"`
	DeletedAt     gorm.DeletedAt `json:"deleted_at"`
}

func (tb *Order) TableName() string {
	return "orders"
}

func (tb *Order) GetAbleType() string {
	return tb.OrderableType
}

func (tb *Order) GetAbleID() int {
	return tb.OrderableId
}

func (tb *Order) SetLoadedAbleData(data any) {
	tb.Orderable = data
}



//---------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值