生成迁移脚本后不能直接运行,必须先人工核验内容是否合理、安全、符合预期;打开迁移文件确认up()含非空操作(如$schema->createtable()或$this->addsql()),若为空则说明doctrine未识别变更,需通过doctrine:schema:update --dump-sql比对验证,并检查实体注解、命名空间及mapping配置是否正确。

生成迁移脚本后不能直接运行,必须先人工核验内容是否合理、安全、符合预期。
打开迁移文件,确认有实际 SQL 或 Schema 操作
迁移文件(如 migrations/Version20260730104900.php)的 up() 方法里必须包含非空操作。常见正确形式是:
-
$schema->createTable('posts')或$schema->alterTable('users') -
$this->addSql('ALTER TABLE ...')(仅在需绕过 Schema 抽象层时使用)
如果只有空的 up() 和 down() 函数体,说明 Doctrine 没检测到结构差异——这不是脚本“生成成功”,而是“未识别变更”。此时要回退排查实体或配置问题。
用 schema:update --dump-sql 对照验证
该命令输出 Doctrine 认为当前应执行的全部 SQL,是判断迁移是否合理的黄金参照:
- 运行
php bin/console doctrine:schema:update --dump-sql - 比对输出是否与你刚生成的迁移中
up()内容基本一致(字段名、类型、索引、外键等) - 如果不一致,说明迁移文件没反映真实意图,可能因缓存未清、注解缺失或 mapping 路径未覆盖
检查实体是否被 Doctrine 正确加载
迁移依赖元数据,而元数据来自实体类。验证方式包括:
- 运行
php bin/console doctrine:mapping:info,确认你的实体类出现在列表中 - 检查实体是否含
@ORM\Entity(PHP 7.x)或#[ORM\Entity](PHP 8+) - 确认命名空间与文件路径严格匹配(如
App\Entity\User必须在src/Entity/User.php) - 查看
php bin/console debug:config doctrine,确认entity_managers.default.mappings包含App\Entity\
留意平台特性和隐性不一致
某些差异不会触发迁移,但可能埋下隐患:
- PostgreSQL 中
options={"autoincrement":true}被忽略,但会影响后续 diff 判断 - MySQL 的
ENGINE=InnoDB、字符集、索引名(UNIQ_abcvsidx_email)不参与比对 - 表名大小写敏感(尤其 PostgreSQL),
@ORM\Table(name="User")和数据库中user表会被视为不同
这些情况可能导致本地测试通过,上线后报错。建议在目标环境(如测试库)先跑一次 --dump-sql 确认。











