恢复 laravel-admin 菜单需优先检查 admin_menu 表状态,通过源码默认 sql 或 git/备份还原数据,注意 id 唯一性、uri 路径匹配及关联权限,生产环境应禁用直接删除并代码化菜单配置。

如果在 Laravel-admin 中误删了菜单(admin_menu 表)的数据,恢复的关键是找回被删除的菜单记录。由于 Laravel-admin 的菜单数据通常由迁移文件或初始化脚本生成,**没有自动备份机制**,所以恢复依赖于是否有备份、是否记得原始结构,或能否从项目源码中还原。
确认删除范围和当前状态
先检查数据库中 admin_menu 表是否为空或仅剩少量记录:
SELECT * FROM admin_menu ORDER BY parent_id, order;
同时查看 Laravel-admin 的默认菜单结构逻辑:顶级菜单 parent_id = 0,子菜单通过 parent_id 关联上级 ID,order 控制排序,url 和 icon 为常见字段。
从 Laravel-admin 源码还原默认菜单 SQL
Laravel-admin 安装后会发布默认菜单迁移(如 2016_01_01_000000_create_admin_menu_table.php),但该文件只建表,不插入数据。实际初始菜单由 php artisan admin:install 命令执行,其 SQL 插入语句固化在框架源码中(如 Encore\Admin\Console\InstallCommand 类)。以下是 Laravel-admin v1.8+ 常见的默认菜单插入语句(可直接执行恢复):
INSERT INTO `admin_menu` (`id`, `parent_id`, `order`, `title`, `icon`, `uri`, `permission`, `created_at`, `updated_at`) VALUES (1, 0, 1, 'Dashboard', 'fa-bar-chart', '/', NULL, '2020-01-01 00:00:00', '2020-01-01 00:00:00'), (2, 0, 2, 'Admin', 'fa-tasks', NULL, NULL, '2020-01-01 00:00:00', '2020-01-01 00:00:00'), (3, 2, 3, 'Users', 'fa-users', 'auth/users', NULL, '2020-01-01 00:00:00', '2020-01-01 00:00:00'), (4, 2, 4, 'Roles', 'fa-user', 'auth/roles', NULL, '2020-01-01 00:00:00', '2020-01-01 00:00:00'), (5, 2, 5, 'Permissions', 'fa-bolt', 'auth/permissions', NULL, '2020-01-01 00:00:00', '2020-01-01 00:00:00'), (6, 2, 6, 'Menu', 'fa-list', 'auth/menu', NULL, '2020-01-01 00:00:00', '2020-01-01 00:00:00'), (7, 2, 7, 'Operation Log', 'fa-history', 'auth/logs', NULL, '2020-01-01 00:00:00', '2020-01-01 00:00:00');
注意:
- ID 必须唯一且连续(尤其当关联其他表如
admin_permissions时),若原表已有部分数据,需调整id起始值并确保不冲突; -
created_at和updated_at可统一设为当前时间(如NOW()); - 如果你使用了自定义菜单(如添加了「商品」「订单」等业务菜单),这部分需单独从 Git 历史、备份或配置文件中提取补回。
从 Git 或备份中恢复自定义菜单
很多团队会把菜单配置化(如通过 app/Admin/routes.php 或自定义菜单服务类管理)。检查以下位置:
- Git 提交历史:
git log -p -- app/Admin/查看最近修改; - 数据库备份文件(如
mysqldump输出)中搜索INSERT INTO `admin_menu`; - 线上环境导出的 SQL(若有定期备份习惯);
- 本地开发环境的数据库,可能尚未同步删除操作。
预防再次误删的建议
菜单是权限系统的入口,生产环境应严格管控:
- 禁止在生产库直接执行
DELETE FROM admin_menu类语句,所有变更走迁移或部署脚本; - 将菜单结构代码化(如用
Admin::menu()->add()在服务提供者中注册),而非仅依赖数据库维护; - 上线前对
admin_menu表做快照备份:CREATE TABLE admin_menu_backup AS SELECT * FROM admin_menu;; - 给运维账号限制 DELETE 权限(仅保留 INSERT/UPDATE/SELECT)。
恢复不复杂但容易忽略细节,重点是核对 ID 关联和 URI 路径是否与当前路由匹配,否则会出现菜单显示但点击 404 的情况。











