【PHP】ThinkPHP8数据库迁移示例

小破孩
2025-07-26 / 0 评论 / 0 阅读 / 正在检测是否收录...

以下是一个包含 各种字段类型、约束条件、索引和特殊配置 的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外键、级联操作关联分类表,删除/更新时级联处理
tagsJSON类型存储数组/对象结构,适合非结构化数据
create_time时间戳(自动维护)addTimestamps()生成,记录创建时间
delete_time软删除字段addSoftDelete()生成,非NULL表示已删除

执行迁移

# 创建表
php think migrate:run

# 回滚(删除表)
php think migrate:rollback

注意事项

  1. 外键依赖:示例中category_id关联categories表,需确保categories表已存在(可先创建分类表迁移)。
  2. 索引优化:根据查询场景添加索引,避免过度索引影响写入性能。
  3. 软删除addSoftDelete()会自动添加delete_time字段(datetime类型,默认NULL),适合逻辑删除。
  4. 枚举值:修改枚举值需谨慎,生产环境可能需要先添加新值再迁移数据。
  5. 字段注释:每个字段添加清晰注释,便于后期维护(尤其团队协作场景)。

通过这个示例,可以覆盖ThinkPHP8迁移工具中绝大多数字段配置场景,实际开发中可根据需求调整。

0

评论 (0)

取消