根本原因是迁移记录残留而物理表缺失,Laravel仅校验migrations表不检查实际表存在与否,导致migrate静默跳过;须先删对应迁移记录、核对配置、再执行迁移。

直接结论:不是重跑 php artisan migrate 就能解决,必须先清理残留记录、确认表名配置、再针对性执行迁移。
为什么 php artisan migrate 不起作用?
因为 Laravel 的迁移系统只查 migrations 表里有没有对应记录(如 2016_01_04_173148_create_admin_table),不检查物理表是否存在。你删过 users 或 roles 表但没清 migrations 表,Laravel 就跳过创建——所以再跑一遍 migrate 什么都不会发生。
- 运行
SELECT * FROM migrations WHERE migration LIKE '%admin%';查看是否已有记录 - 如果结果非空,说明迁移“已被标记为完成”,但表可能早被删了
- 此时硬跑
migrate不报错也不建表,属于静默跳过
如何安全清理并重建权限表?
不能直接删库重来,尤其生产环境有数据时。推荐分步清理:
- 手动从
migrations表中删掉所有含admin的记录:DELETE FROM migrations WHERE migration LIKE '%admin%'; - 确认
config/admin.php中的表名配置正确,例如:'users_table' => 'admin_users',避免迁移时用空字符串建表(会触发Incorrect table name ''错误) - 确保
AppServiceProvider::boot()中已设置:Schema::defaultStringLength(191);,否则 MySQL 5.7+ 下string(255)字段会因索引超长失败 - 再执行:
php artisan migrate——这次才会真正建表
执行 admin:install 前必须检查的三件事
php artisan admin:install 是封装命令,内部会调 migrate + seed,但它依赖前置条件成立:
- 数据库连接必须通,且用户有
CREATE权限(常见于 Docker 环境默认用户权限不足) -
public/vendor/laravel-admin目录必须存在且非空;若为空,先跑:php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider" - 确保
config/admin.php中'prefix'没被意外注释或设为空,否则路由注册失败,后续填充器查不到表
Seeder 报 Table 'xxx.modules' doesn't exist 怎么办?
这个错误表面是 modules 表缺失,实际大概率是 laravel-admin 的扩展模块(比如 laravel-admin-ext/backup)自带的迁移没跑。这类扩展通常有自己的迁移文件,不会被主 migrate 命令捕获。
- 检查
database/migrations下是否有类似2023_05_10_120000_create_modules_table.php的文件 - 如果没有,说明扩展包未发布迁移:运行
php artisan vendor:publish --provider="Encore\Admin\Extensions\Backup\BackupServiceProvider" --tag=migrations(替换为实际扩展名) - 再单独执行该迁移:
php artisan migrate --path=database/migrations/2023_05_10_120000_create_modules_table.php
最易忽略的是:Spatie Permissions 缓存不会随迁移自动刷新。即使表重建成功,Role::create() 仍可能查不到刚插入的数据——必须额外运行 php artisan permission:cache-reset。


















