laravel-admin 和 Laravel Nova 是互斥的后台方案,需二选一;常见问题包括安装失败、路由不匹配、资源类路径错误及 N+1 查询,二者字段逻辑与权限控制机制截然不同。

laravel-admin 和 Laravel Nova 是两个完全独立的后台方案,不能混用或“构建在一起”。选一个,不是“如何构建 _LaravelNova 后台面板”,而是“用 laravel-admin 还是用 Nova”——这是个非此即彼的决策。
laravel-admin 安装后打不开 / 登录页 404
最常见原因是 admin:install 命令没跑成功,或数据库迁移失败。检查三件事:
-
php artisan admin:install执行时是否报 SQL 错误?比如Specified key was too long—— 需在AppServiceProvider::boot()中加Schema::defaultStringLength(191) -
config/admin.php里'prefix'值是否被改过?默认是'admin',访问地址必须严格匹配http://localhost/admin(末尾不带斜杠) - 确认
public/vendor/laravel-admin目录存在且非空;若为空,重跑php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"
Nova 资源类写好但侧边栏不显示
Nova 不会自动扫描子目录或别名类,只认 app/Nova/ 下的文件,且要求严格匹配:
- 文件路径必须是
app/Nova/User.php,不能是app/Nova/Models/User.php - 类名必须是
User,不能是App\Nova\UserResource或UserAdmin - 类必须继承
Laravel\Nova\Resource,并定义public static $model = \App\Models\User::class;(注意是字符串,不是类引用) - 确保
NovaServiceProvider已在config/app.php的providers数组中注册
关联字段显示 N+1、列表卡顿
Nova 默认不做预加载,Text::make('Author Name', 'author.name') 这种写法会在每行触发一次查询。修复方式不是在字段里加 with(),而是重写资源类的两个方法:
-
indexQuery(NovaRequest $request, $query):在这里加$query->with('author', 'category') -
relatableQuery(NovaRequest $request, $query, $resource):控制下拉/搜索时的关联数据范围,比如只查已启用的分类:return $query->where('active', true);
漏掉任一方法,都可能在不同场景下触发 N+1。
laravel-admin 的 Grid 和 Nova 的 Resource 字段逻辑差异
两者字段配置表面相似,底层行为完全不同:
- laravel-admin 的
$grid->name('姓名')默认读取模型的name属性,可直接编辑;若想展示关联字段,得用$grid->column('author.name', '作者'),且需在控制器里手动with('author') - Nova 的
Text::make('Name', 'name')中第二个参数是数据库列名或访问器名;若填'author.name',它会尝试调用模型的getAuthorNameAttribute(),而不是走关系查询——除非你显式重写了indexQuery - laravel-admin 没有内置的权限粒度控制(如某字段仅管理员可见),Nova 则可通过
canSee()方法动态控制字段/操作的显示
字段名看着一样,但背后的数据流和执行时机差很远,切勿凭经验直接移植。


















