--squash 不等于“一键压缩全部迁移”,因为它仅合并尚未执行的迁移文件,对已执行的20个迁移无影响;它由第三方库提供,生成新迁移后需手动运行 migrate,且不处理视图等非表结构。

php artisan migrate:generate --squash 能合并迁移文件,但不是“把所有历史迁移压成一个”,而是把尚未执行的迁移打包成单个新迁移——已执行的迁移不会动,也不能回滚到合并前的状态。
为什么 squash 不等于“一键压缩全部迁移”
Laravel 原生没有 migrate:squash 命令;所谓 squash 是第三方库 kitloong/laravel-migrations-generator 提供的功能,它只作用于「数据库里还没执行、但本地已存在」的迁移文件。也就是说:
- 如果
php artisan migrate已跑过 20 个迁移,--squash对它们完全没反应 - 它只会扫描
database/migrations/下那些 migration 名字没出现在migrations表里的文件 - 生成的新迁移文件里,
up()是把这批表结构一次性建完,down()是按依赖顺序反向删表(不保证 100% 安全,尤其含外键时) - 生成后你仍需手动运行
php artisan migrate,否则新文件不会进migrations表
实际执行 squash 的完整流程
假设你刚加了 5 个新迁移文件,但还没 run 过任何一条:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 先确认当前没执行过:查
SELECT * FROM migrations;,确保结果为空或不含这 5 个文件名 - 运行
php artisan migrate:generate --squash - 它会生成一个类似
2026_08_17_113022_create_all_pending_tables.php的新文件 - 打开看
up():里面是Schema::create()块堆叠,不是Schema::table() - 别急着删原来的 5 个文件——先
php artisan migrate跑通这个新文件,再删旧的,否则协作时别人拉代码会漏结构
容易被忽略的三个坑
很多人用 --squash 后翻车,问题不在命令本身,而在上下文没理清:
-
DB_DATABASE指向错库:.env 里连的是测试库,但你本意是为生产库生成合并迁移 —— 结果新文件里建的表全在测试库,生产库还是空的 - 表前缀没生效:虽然
kitloong支持前缀,但必须在config/database.php的对应 connection 里显式配'prefix' => 'wp_',光在 .env 写DB_PREFIX=wp_不起作用 - 视图/存储过程被跳过:默认只处理表(
CREATE TABLE),如果迁移里有DB::unprepared("CREATE VIEW ..."),--squash不会提取这部分逻辑,得手动补进新文件
真正要压缩已执行的迁移历史,得靠人工:删 migrations 表记录 + 手动导出现有结构为初始迁移 + php artisan migrate:reset 清场,但这一步没法自动化,也别指望工具替你做决定。

















