必须调整执行环境、命名空间、路径和方法签名才能在TP8下运行迁移文件;需放于database/migrations/,命名空间为DatabaseMigrations,继承thinkmigrationMigration,up/down方法须加Schema类型声明,禁用模型操作,已执行迁移不可修改。

不需要重新生成迁移文件,但必须调整执行环境、命名空间、路径和方法签名才能在 TP8 下正常运行。
think-migration 生成的迁移类本身(比如 CreateUsersTable)逻辑可复用,真正卡住的是加载机制和 PHP 8 的类型约束。直接把旧文件扔进 TP8 项目里,99% 会报 Class not found 或 Return type declaration must be compatible。
迁移文件必须放在 database/migrations/ 目录
TP8 不扫描 app/database 或任何自定义路径,只认标准 Laravel 风格位置:
- 正确路径:
database/migrations/20240315102345_create_users_table.php - 错误路径:
app/database/migrations/...、runtime/migrate/...、config/migrations/...
同时要确保 composer.json 中有对应 PSR-4 映射:
立即学习“PHP免费学习笔记(深入)”;
"autoload": {
"psr-4": {
"Database\Migrations\": "database/migrations/"
}
}
改完必须执行 composer dump-autoload,否则类永远找不到。
类名、命名空间、继承关系三者必须严格匹配
- 文件名(不含扩展):如
20240315102345_create_users_table.php→ 类名必须是CreateUsersTable - 命名空间必须是
DatabaseMigrations(注意双反斜杠) - 必须继承
thinkmigrationMigration,不是 TP6 的PhinxMigrationAbstractMigration
常见错误写法:
-
namespace AppDatabaseMigrations;→ 错,TP8 迁移命令不识别 -
class create_users_table extends Migration→ 错,首字母必须大写且无下划线 - 继承
PhinxMigrationAbstractMigration→ 错,TP8 已弃用 Phinx 依赖
up() 和 down() 方法需补全 PHP 8 类型声明
TP6 时期宽松的写法在 TP8 + PHP 8.0+ 下会直接 fatal:
- ❌
public function up($schema) - ✅
public function up(Schema $schema): void
同样,down() 也必须声明参数类型和返回类型:
- ✅
public function down(Schema $schema): void
如果迁移类中用了 Model 操作数据(比如 User::create()),要全部换成 Db::table('user')->insert() —— 迁移执行时模型可能尚未注册或配置未加载,极易静默失败。
旧迁移已执行过,不能直接改文件内容
已通过 php think migrate:run 执行过的迁移文件,禁止修改其 up() 内容。MySQL 8.0 strict 模式下,字段默认值、nullable、索引等变更若没显式声明,会导致后续执行失败。
需要修复时,应:
- 新增一个迁移文件(用
php think make:migration fix_user_email_nullable) - 在新文件
up()中用$table->string('email')->nullable()->change() - 不要在原文件里加
->nullable()后重跑 —— TP8 不支持“重放”已记录的迁移
真正容易被忽略的是:迁移能否跑通,不取决于你写了什么 SQL,而取决于类能不能被自动加载、方法签名是否满足 PHP 8 强制类型、以及 Schema 实例是否由 TP8 兼容的迁移驱动提供。这三者缺一不可。



















