thinkphp 8.0需通过topthink/think-migration:^4.0扩展实现数据库迁移,安装后执行migrate:install建migrations表,再用migrate:create生成带时间戳的迁移文件,编写up()和down()方法实现结构变更与回滚,通过migrate:run执行、migrate:status查看状态。

ThinkPHP 8.0 本身不内置数据库迁移功能,必须通过官方生态推荐的第三方扩展 topthink/think-migration 实现。它不是开箱即用的命令,而是需要手动安装、初始化并规范编写迁移文件的一套结构化流程。
安装适配版本的迁移扩展
TP8 对应的是 topthink/think-migration:^4.0(注意不是 ^3.0,那是 TP6 的)。执行以下命令:
composer require topthink/think-migration:^4.0- 装完后检查
vendor/topthink/think-migration/src/Command是否存在,避免 autoload 失效导致命令不可用 - TP8 默认启用命令自动发现,一般无需在
app/command.php中手动注册迁移类
初始化迁移系统并生成文件
迁移依赖一张记录执行历史的表(migrations),需先创建:
- 运行
php think migrate:install—— 这会建好migrations表 - 再用
php think migrate:create CreateUsersTable生成迁移文件,路径为database/migrate/20240921153000_create_users_table.php(含时间戳前缀) - 文件名格式必须是
YYYYMMDDHHIISS_describe,否则框架无法识别和排序
编写可逆的 up() 和 down() 方法
迁移文件是一个继承 think\migration\Migrate 的 PHP 类,核心逻辑写在两个方法里:
-
up():定义正向变更,比如建表、加字段、设索引。推荐用链式语法:
$this->table('users')->addColumn('email', 'string', ['limit' => 100])->create() -
down():必须与 up() 严格可逆。建表对应删表,加字段对应删字段;建议在删操作前加判断:
if ($this->hasTable('users')) { $this->dropTable('users'); } - 避免在迁移中调用模型或业务逻辑,只专注数据库结构变更
执行与状态管理
迁移不是一次性动作,而是一套带状态追踪的机制:
- 运行
php think migrate:run执行待迁移项(注意不是php think migrate,后者无响应) - 用
php think migrate:status查看哪些已执行、哪些待执行 - 回滚慎用:
php think migrate:rollback仅回退最后一次,生产环境务必提前验证 down() 是否真正安全 - 若遇 SQL 兼容问题(如 MySQL 8+ 的
utf8mb4_0900_as_cs排序规则),可在createTable()的options参数中显式指定
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











