核心是让 Laravel 认为“建表迁移已完成”且保留数据:①表存在但 migrations 无记录→手动插入 migration 记录;②回滚失败→用 dropIfExists 或 db:wipe;③仅补字段/种子→新建迁移或单独 seed。

直接删表或强行重跑迁移不是办法,核心是让 Laravel 认为“建表迁移已完成”,同时保留已有数据结构。下面分三类真实场景给可落地的操作。
表已存在但 migrations 表没记录
典型现象:执行 php artisan admin:install 报错 SQLSTATE[42S01]: Base table or view already exists,但查 migrations 表发现对应迁移(如 2018_01_01_000000_create_admin_tables)根本没写入。
- 说明迁移脚本没真正跑过,只是表被手动建了或从 SQL 导入了
- 别删表,也别改迁移文件——直接向
migrations表插入记录即可 - 运行 SQL:
INSERT INTO migrations (migration, batch) VALUES ('2018_01_01_000000_create_admin_tables', 1); - 再执行
php artisan admin:install,它会跳过建表,继续执行后续字段、索引、种子等操作
表和 migrations 记录都存在,但 migrate:rollback 失败
常见于外键或字段类型冲突,比如回滚时 Schema::drop('admin_users') 报 SQLSTATE[23000]: Integrity constraint violation。
-
down()方法里必须用Schema::dropIfExists('admin_users'),不能只写drop() - 如果已报错且卡住,先手动清空
migrations表中该条记录:DELETE FROM migrations WHERE migration = '2018_01_01_000000_create_admin_tables'; - 再运行
php artisan migrate:reset可能仍失败——此时改用php artisan db:wipe --force(Laravel 9+),它会自动处理外键顺序
想保留现有 admin 表结构,只补全缺失字段或种子数据
比如你已有 admin_users 表,但缺 avatar 字段或没初始化管理员账号。
- 不要碰
create_admin_tables迁移,新建一个专用迁移:php artisan make:migration add_avatar_to_admin_users_table --table=admin_users - 在
up()中加字段,在down()中删字段,不碰表本身 - 补种子数据?单独运行
php artisan db:seed --class=AdminUserTableSeeder(假设你写了这个 Seeder) - laravel-admin 的初始用户密码默认由
admin:install写入,若跳过了这步,得手动 INSERT 或用php artisan tinker创建
最易忽略的一点:laravel-admin 的迁移文件名前缀(如 2018_01_01_000000)必须和 migrations 表里插入的值完全一致,多一个空格或少一位数都会导致跳过失败。建议复制粘贴,别手敲。


















