以下是一个包含 各种字段类型、约束条件、索引和特殊配置 的ThinkPHP8数据库迁移示例(以products
产品表为例),覆盖常见场景:
迁移文件示例(database/migrations/20250726153000_create_products_table.php
)
<?php
use think\migration\Migrator;
use think\migration\db\Column;
class CreateProductsTable extends Migrator
{
/**
* 执行迁移(创建表结构)
*/
public function up()
{
// 创建products表,配置表级参数
$table = $this->table('products', [
'engine' => 'InnoDB', // 数据库引擎
'charset' => 'utf8mb4', // 字符集
'collation' => 'utf8mb4_unicode_ci', // 排序规则
'comment' => '产品表(包含多种字段类型示例)', // 表注释
'auto_increment' => 1000, // 自增ID起始值(MySQL支持)
]);
// 字段定义(覆盖各种场景)
$table
// 1. 自增主键(整数型,无符号,自增)
->addColumn('id', 'integer', [
'identity' => true, // 自增
'unsigned' => true, // 无符号(只存正数)
'comment' => '产品ID(主键)'
])
// 2. 字符串(有限长度,非空,唯一索引)
->addColumn('sku', 'string', [
'limit' => 50, // 长度限制
'null' => false, // 非空(默认)
'comment' => '产品SKU(唯一标识)',
'unique' => true // 唯一约束
])
// 3. 字符串(长文本,可空,带默认值)
->addColumn('name', 'string', [
'limit' => 255,
'null' => false,
'default' => '', // 默认空字符串
'comment' => '产品名称'
])
// 4. 文本类型(无长度限制,可空)
->addColumn('description', 'text', [
'null' => true, // 允许为空
'comment' => '产品详细描述'
])
// 5. 小数类型(高精度,带默认值)
->addColumn('price', 'decimal', [
'precision' => 10, // 总位数
'scale' => 2, // 小数位数
'default' => 0.00, // 默认0.00
'comment' => '产品售价'
])
// 6. 整数类型(无符号,默认值,索引)
->addColumn('stock', 'integer', [
'unsigned' => true, // 无符号(只存正数)
'default' => 0, // 默认库存0
'comment' => '库存数量',
'index' => true // 普通索引
])
// 7. 枚举类型(固定可选值)
->addColumn('status', 'enum', [
'values' => ['draft', 'active', 'disabled'], // 可选值
'default' => 'draft', // 默认草稿状态
'comment' => '产品状态(draft:草稿, active:上架, disabled:下架)'
])
// 8. 布尔类型(tinyint,默认true)
->addColumn('is_recommend', 'boolean', [
'default' => true, // 默认true(1)
'comment' => '是否推荐(1:是, 0:否)'
])
// 9. 外键关联(整数,无符号,级联操作)
->addColumn('category_id', 'integer', [
'unsigned' => true,
'null' => false,
'comment' => '所属分类ID',
'index' => true // 普通索引
])
// 10. JSON类型(存储复杂结构,可空)
->addColumn('tags', 'json', [
'null' => true,
'comment' => '产品标签(JSON格式,如["新品","热卖"])'
])
// 11. 时间戳类型(自动维护)
->addTimestamps() // 自动添加 create_time 和 update_time(datetime类型)
// 12. 软删除字段(自动维护删除时间)
->addSoftDelete() // 添加 delete_time 字段(软删除标识)
// 13. 整数类型(排序权重,默认0)
->addColumn('sort', 'integer', [
'default' => 0,
'comment' => '排序权重(值越大越靠前)'
])
// 添加外键约束(关联分类表)
->addForeignKey('category_id', 'categories', 'id', [
'delete' => 'CASCADE', // 分类删除时,关联产品也删除
'update' => 'CASCADE' // 分类ID更新时,产品关联ID同步更新
])
// 添加联合索引(名称+状态)
->addIndex(['name', 'status'], [
'name' => 'idx_name_status' // 自定义索引名
])
// 执行创建表
->create();
}
/**
* 回滚迁移(删除表)
*/
public function down()
{
// 先删除外键约束(避免删除表失败)
$this->table('products')->dropForeignKey('category_id');
// 再删除表
$this->dropTable('products');
}
}
关键字段配置说明
字段名 | 类型/配置 | 核心特点 |
---|---|---|
id | 自增整数、主键 | 无符号,自增起始值1000 |
sku | 字符串、唯一约束 | 唯一标识,非空,长度50 |
name | 字符串、默认值 | 非空,默认空字符串,用于产品名称 |
description | 文本类型、可空 | 无长度限制,允许为空(适合长文本描述) |
price | 小数(10,2) | 高精度价格,默认0.00 |
stock | 无符号整数、索引 | 库存数量,非负,普通索引提升查询效率 |
status | 枚举类型 | 固定可选值,默认草稿状态 |
is_recommend | 布尔类型 | 本质tinyint,默认true(1) |
category_id | 外键、级联操作 | 关联分类表,删除/更新时级联处理 |
tags | JSON类型 | 存储数组/对象结构,适合非结构化数据 |
create_time | 时间戳(自动维护) | 由addTimestamps() 生成,记录创建时间 |
delete_time | 软删除字段 | 由addSoftDelete() 生成,非NULL表示已删除 |
执行迁移
# 创建表
php think migrate:run
# 回滚(删除表)
php think migrate:rollback
注意事项
- 外键依赖:示例中
category_id
关联categories
表,需确保categories
表已存在(可先创建分类表迁移)。 - 索引优化:根据查询场景添加索引,避免过度索引影响写入性能。
- 软删除:
addSoftDelete()
会自动添加delete_time
字段(datetime类型,默认NULL),适合逻辑删除。 - 枚举值:修改枚举值需谨慎,生产环境可能需要先添加新值再迁移数据。
- 字段注释:每个字段添加清晰注释,便于后期维护(尤其团队协作场景)。
通过这个示例,可以覆盖ThinkPHP8迁移工具中绝大多数字段配置场景,实际开发中可根据需求调整。
评论 (0)