正确写法是php artisan make:migration create_users_table,类名合法且符合Laravel迁移命名规范;错误写法如add email to users因含空格导致文件名非法,后续migrate会跳过该文件。
php artisan make:migration 命令怎么写才不报错
创建迁移文件最常踩的坑是表名和动作描述混在一起,导致生成的类名非法(比如含冒号、空格或中文)。Laravel 要求迁移文件名必须是「时间戳_小写字母+下划线」格式,而
命令只负责生成骨架,不校验语义。
正确写法:
(生成
类)
错误写法:
(空格和关键词导致类名
但文件名非法,后续
会跳过该文件)
如果要加字段,推荐用
模式,如
别在命令里写数据库类型(如
),迁移逻辑写在
方法里更清晰
迁移文件里 Schema::create 和 Schema::table 的区别
新手常把建表和改表逻辑全塞进一个迁移,结果上线后执行失败——因为
要求表不存在,
要求表必须存在。两者不能互换,且 Laravel 不做运行时检查。
:仅用于新建表,若表已存在,执行时抛出
:仅用于修改已有表,若表不存在,抛出
新增字段、索引、外键一律用
;删字段需注意 MySQL 8.0+ 才支持
,低版本得手写
一个迁移文件里可以多次调用
,但不要混用
和
php artisan migrate 执行失败常见原因
执行迁移卡住或报错,90% 不是语法问题,而是环境状态不一致:本地有表、生产库没表;或者 migration 表记录错乱。
Laravel 13.2.0
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
下载
先确认
表是否存在且可读写(Laravel 自动建,但某些共享主机禁用自动建表)
执行
查看哪些迁移标记为
,哪些是
;如果状态和磁盘文件不一致,别直接
,先用
或手动清理
表
MySQL 报
?那是默认 utf8mb4 字符集下索引长度超限,要在
的
配置里加
,并确保
中调用了
执行中中断(Ctrl+C 或超时),可能导致
表写入一半,此时要先查
表最后一条记录,再决定是
还是手动删记录
本地开发和线上部署迁移操作差异
本地
可以反复跑,线上却必须严格按顺序、只进不退。Laravel 不锁迁移过程,多实例并发执行同一迁移可能引发冲突。
线上部署务必加
参数(否则交互式确认会卡住),例如:
禁止在生产环境用
或
,它们会删数据;要用
仅限新环境初始化
团队协作时,迁移文件一旦提交 Git,就不能再改
或
逻辑;修复只能靠新增迁移文件(比如字段类型改错了,就写个
)
有些云数据库(如 AWS RDS Proxy、阿里云 PolarDB)对 DDL 语句有连接池限制,长迁移(如给千万级表加索引)建议拆成两步:先
(如果支持),再用 Laravel 迁移包装
迁移不是写完就能跑通的代码,它是数据库 schema 的“版本快照”,一旦生效,回滚成本远高于 PHP 代码。每次改
前,先想清楚 down() 怎么写,哪怕暂时用不上。
make:migrationphp artisan make:migration create_users_tableCreateUsersTablephp artisan make:migration add email to usersAddEmailToUsersartisan migrateadd_{field}_to_{table}_tableadd_phone_to_users_tablecreate_users_table_with_uuidup()Schema::create()Schema::table()Schema::create('users', function (Blueprint $table) { ... })SQLSTATE[42S01]: Base table or view already existsSchema::table('users', function (Blueprint $table) { ... })SQLSTATE[42S02]: Base table or view not foundSchema::table()$table->dropColumn()DB::statement()Schema::table()createtablemigrationsphp artisan migrate:statusRanPendingmigratemigrate:resetmigrationsSpecified key was too longconfig/database.phpmysql'engine' => 'InnoDB ROW_FORMAT=DYNAMIC'App\Providers\AppServiceProviderSchema::defaultStringLength(191)migrationsmigrationsmigrate:rollbackphp artisan migrate--forcephp artisan migrate --force --no-interactionmigrate:refreshmigrate:resetmigrate:fresh --seedup()down()change_email_type_in_users_tableALTER TABLE ... ALGORITHM=INPLACEup()