laravel不同版本数据库迁移核心差异在于依赖要求、默认行为、语法支持和底层机制:5.8起修改字段必须安装doctrine/dbal;9+默认禁用外键约束,需显式启用;8+支持--table/--create参数生成迁移;9+起enum()等方法不再自动兼容多数据库,须按驱动分支处理。

Laravel不同版本在数据库迁移的安装和使用上,核心差异不在“安装命令”本身(始终是php artisan migrate),而在于依赖要求、默认行为、语法支持和底层机制。忽略这些区别,轻则迁移失败,重则数据损坏或跨环境不一致。
doctrine/dbal 是否必须安装
从 Laravel 5.8 起,修改已有字段(如改类型、加默认值、设 nullable)必须依赖 doctrine/dbal 包。但各版本对它的“强制性提示”不同:
- Laravel 5.8–8.x:未安装时执行
->change()会直接报错 Class 'Doctrine\DBAL\Types\Type' not found - Laravel 9+:错误信息更明确,提示 “You must install the doctrine/dbal package to use this feature”
- Laravel 10:仍需手动
composer require doctrine/dbal,框架不再自动引入
外键约束默认开关变化
这是影响数据完整性的关键差异:
- Laravel 5.4–8.x:
Schema::create()默认启用外键约束,foreignId()生成的外键可立即生效 - Laravel 9+:默认调用
disableForeignKeyConstraints(),即使写了->constrained()->onDelete('cascade'),迁移后查表也看不到 FOREIGN KEY 定义 - 修复方式统一:在
up()方法末尾显式加Schema::enableForeignKeyConstraints();
迁移文件生成命令的演进
命令更便捷,但底层逻辑一致:
- Laravel 5.4:仅支持
php artisan make:migration create_users_table - Laravel 8+:新增
--table和--create参数,例如php artisan make:migration modify_users_table --table=users,自动生成带Schema::table()的骨架 - Laravel 9+:保留全部参数,同时支持
php artisan make:migration:schema(需额外包),可一键生成含 id、timestamps 等常用字段的迁移
跨数据库兼容性处理要求升级
越新版本对多平台支持越谨慎,要求开发者主动适配:
- Laravel 5.4–7.x:
$table->timestamps()在 SQLite 和 MySQL 下行为基本一致,容易忽略隐式差异 - Laravel 8+:文档和生成器开始强调显式写法,如
$table->timestamps()->useCurrent()->useCurrentOnUpdate(),避免 MySQL 报 “Invalid default value” - Laravel 9+:
enum()、foreignIdFor()等方法引入,但它们在 PostgreSQL/MySQL/SQLite 上语法冲突明显,官方不再尝试“自动兼容”,而是要求按驱动分支处理或改用字符串+模型枚举











