承接 watsonhaw/think-migration 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

watsonhaw/think-migration

Composer 安装命令:

composer require watsonhaw/think-migration

包简介

The ThinkPHP8 migration extend

README 文档

README

ThinkPHP 8 数据库迁移工具通过 适配器模式 深度集成 Phinx,提供了简单易用的数据库迁移和数据填充功能,帮助开发者更高效地管理数据库版本。

📌 架构说明:本项目不再将 Phinx 复制到项目中,而是通过适配器将 ThinkPHP 的 Input/Output 桥接到 Symfony Console 接口,从而直接使用 Composer 安装的原始 Phinx 类。这意味着你可以通过 composer update robmorgan/phinx 轻松升级 Phinx 版本。

安装

使用 Composer 安装此工具:

composer require watsonhaw/think-migration

功能特性

  • 数据库迁移:使用数据库无关的 PHP 代码编写迁移脚本,支持自动回滚。
  • 数据填充:在数据库创建后填充初始数据,支持 Faker 随机数据生成。
  • 模型工厂:通过 Factory 模式快速生成测试数据。
  • 多数据库支持:可在多个数据库连接之间切换执行迁移。
  • 快速上手:不到 5 分钟即可开始使用。

目录结构

你的项目根目录/
├── database/
│   ├── migrations/       # 数据库迁移文件(自动创建)
│   ├── seeds/            # 数据填充文件(自动创建)
│   └── factories/        # 模型工厂文件(自动创建)
└── ...

数据库迁移

1. 创建迁移文件

使用以下命令创建一个新的迁移文件:

php think migrate:create YourMigrationName

这将在 database/migrations 目录下生成一个新的迁移文件,文件名格式为 YYYYMMDDHHMMSS_your_migration_name.php

2. 编写迁移逻辑

打开生成的迁移文件,默认继承 think\migration\Migrator 类,该类扩展了 Phinx 的 AbstractMigration,提供了 ThinkPHP 专属的 Table 操作:

<?php

use think\migration\Migrator;
use think\migration\db\Column;

class CreateUsersTable extends Migrator
{
    public function change()
    {
        $table = $this->table('users');
        $table->addColumn('name', 'string', ['limit' => 255])
              ->addColumn('email', 'string', ['limit' => 255])
              ->addColumn('password', 'string', ['limit' => 255])
              ->addTimestamps()
              ->addSoftDelete()
              ->create();
    }
}

提示change() 方法中的操作(如 createTableaddColumnaddIndexaddForeignKey 等),Phinx 会在回滚时自动执行反向操作。对于无法自动反向的操作,请使用 up()down() 方法分别编写。

3. 执行迁移

执行所有未执行过的迁移:

php think migrate:run

回滚最后一批迁移:

php think migrate:rollback

回滚到指定版本:

php think migrate:rollback -t 20240101000000

回滚所有迁移:

php think migrate:rollback -t 0

查看迁移状态:

php think migrate:status

设置断点(防止回滚超过该点):

php think migrate:breakpoint -t 20240101000000

数据填充(Seeding)

1. 创建填充文件

php think seed:create UserSeeder

这将在 database/seeds 目录下生成一个新的填充文件。

2. 编写填充逻辑

<?php

use think\migration\Seeder;

class UserSeeder extends Seeder
{
    public function run()
    {
        $data = [
            ['name' => 'admin', 'email' => 'admin@example.com', 'password' => password_hash('admin', PASSWORD_DEFAULT)],
            ['name' => 'guest', 'email' => 'guest@example.com', 'password' => password_hash('guest', PASSWORD_DEFAULT)],
        ];

        $this->table('users')->insert($data)->save();
    }
}

3. 执行填充

执行所有填充器:

php think seed:run

只执行指定的填充器:

php think seed:run -s UserSeeder

模型工厂(Factory)

1. 创建工厂文件

php think factory:create UserFactory

这将在 database/factories 目录下生成一个新的工厂文件。

2. 定义工厂

<?php

use Faker\Generator as Faker;
use think\migration\Factory;

/** @var Factory $factory */
$factory->define("app\model\User", function (Faker $faker) {
    return [
        'name'     => $faker->name,
        'email'    => $faker->unique()->safeEmail,
        'password' => password_hash('password', PASSWORD_DEFAULT),
    ];
});

3. 在填充器中使用工厂

<?php

use think\migration\Seeder;

class UserSeeder extends Seeder
{
    public function run()
    {
        // 生成 10 个虚拟用户
        $this->factory()->of("app\model\User")->times(10)->create();
    }
}

多数据库支持

如果你的项目使用了多个数据库连接,可以通过 --connection 选项指定要操作的数据库:

# 对指定连接执行迁移
php think migrate:run --connection=mysql_slave

# 对指定连接执行回滚
php think migrate:rollback --connection=mysql_slave -vvv

# 对指定连接执行填充
php think seed:run --connection=mysql_slave

Migrator 类扩展方法

think\migration\Migrator 在 Phinx 的基础上提供了以下扩展方法:

方法 说明
addTimestamps($createdAt = 'create_time', $updatedAt = 'update_time') 添加 create_timeupdate_time 时间戳字段(使用 timestamp 类型)
addDatetimes($createdAt = 'create_time', $updatedAt = 'update_time') 添加 create_timeupdate_time 日期时间字段(使用 datetime 类型,提供更高精度)
addSoftDelete(string $type = 'timestamp') 添加 delete_time 软删除字段,$type 可选 'timestamp'(默认)或 'datetime'
addMorphs(string $name) 添加多态关联字段({name}_id{name}_type

使用示例

public function change()
{
    $table = $this->table('users');
    // 使用 datetime 精度的时间字段
    $table->addDatetimes();
    // 使用 datetime 精度的软删除
    $table->addSoftDelete('datetime');
    $table->create();
}

可用命令一览

命令 说明
php think migrate:create <name> 创建新的迁移文件
php think migrate:run 执行所有未执行的迁移
php think migrate:rollback [-t <version>] 回滚迁移
php think migrate:status 显示迁移状态
php think migrate:breakpoint [-t <version>] 设置/清除断点
php think seed:create <name> 创建新的填充文件
php think seed:run [-s <name>] 执行数据填充
php think factory:create <name> 创建新的模型工厂

版本管理

迁移文件的版本号采用 YYYYMMDDHHMMSS 格式的 14 位时间戳,确保在团队协作中不会产生版本号冲突。

统计信息

  • 总下载量: 0
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 60
  • 开发语言: PHP

其他信息

  • 授权协议: Apache-2.0
  • 更新时间: 2026-06-24

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固