Composer本身不执行数据库迁移,仅负责安装迁移工具;真正的迁移由Phinx、Doctrine等工具通过扫描文件目录而非自动加载来执行。

Composer 本身不管理数据库 Schema,它只负责安装和锁定 PHP 包;真正的 Schema 版本化迁移必须靠第三方迁移工具(如 Phinx、Doctrine Migrations、think-migration)来实现——Composer 只是把它们“装进来”,不参与执行逻辑。
为什么 composer require xxx 不等于数据库就能自动迁移
Composer 的作用仅限于下载代码包、生成 autoloader、写入 vendor/。它不会读取你的数据库配置,也不会扫描 database/migrations/ 目录,更不会执行 SQL。所谓“用 Composer 管理迁移”,本质是:composer require 把迁移工具装进项目,再由你手动或通过脚本调用其二进制或命令行接口(如 ./vendor/bin/phinx 或 php artisan migrate)。
- 常见错误现象:装完
phinx/phinx后直接敲phinx init报command not found—— 这不是 Composer 没装好,而是终端没找到vendor/bin/下的可执行文件 - 迁移文件不被识别,往往是因为路径不对(如 ThinkPHP 强制要求
database/migrate/)、命名不合规(如少一位时间戳)、或类未继承指定基类(如think\migration\Migrate) - PHP 版本错配会直接导致安装失败:比如在 PHP 8.2 下用
composer require robmorgan/phinx(旧包名),会报Could not find package—— 因为该包已废弃,且不支持 PHP 8+
Phinx、Doctrine、think-migration 的关键差异点
选哪个工具,取决于你用的框架和团队习惯。它们都依赖 Composer 安装,但行为逻辑完全不同:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
phinx/phinx:纯 PHP 实现,无框架耦合,靠约定(时间戳命名、up()/down()方法)驱动;适合 Laravel、Slim、自研框架等。v0.15.0+ 才支持 PHP 8+,旧锁文件需清理后重装 -
doctrine/migrations:强依赖 Doctrine DBAL,支持--filter按类名筛选迁移(如--filter="UserService"),适合 Monorepo 场景;但不原生支持视图,需额外扩展(如staudenmeir/laravel-migration-views) -
topthink/think-migration:ThinkPHP 官方适配包,TP6/TP7 必须用 4.x,TP5 只能用 2.x;迁移文件必须放database/migrate/,命名必须是 14 位时间戳开头,否则php think migrate直接跳过
迁移命令执行失败的三个高频原因
绝大多数“迁移跑不通”问题,和 Composer 关系不大,而是执行层没兜住边界条件:
- 数据库连接未就绪:比如
phinx migrate报SQLSTATE[HY000] [1045] Access denied,不是 Phinx 有问题,是phinx.yml里host或password写错了,或 MySQL 用户没授权 - 外键/表存在性没检查:
up()中直接$table->addColumn('user_id', 'integer'),但表已存在,就会报Base table or view already exists;正确做法是先if (!$schema->hasTable('users')) { ... } - 多库环境未显式指定连接:
php artisan migrate --database=tenant必须加--database参数,否则默认走config/database.php中的default,容易误操作主库
真正容易被忽略的是:迁移工具加载迁移文件的方式与 Composer 自动加载完全无关。哪怕你把迁移类加进了 autoload 配置,工具也不会通过 class_exists() 加载它——而是用 Finder::files()->in($path) 扫目录、正则匹配文件名、反射提取类。所以删了 composer.lock 或漏运行 composer dump-autoload,通常不影响迁移执行,除非迁移命令本身是个封装好的 PHP 类(如 Laravel 的 php artisan 命令)。

















