nova资源类必须严格遵循命名规范并手动注册,否则侧边栏不显示;列表卡顿主因是未重写indexquery()实现关联预加载,导致n+1查询。

Nova 资源类一旦定义错误或配置松散,后台列表页立刻变卡顿、字段空白、关联数据报错——这不是前端慢,是 PHP 层查询没控制好。
资源类必须放在 app/Nova 且文件名与类名严格一致
Nova 不扫描子目录,也不容许命名偏差。哪怕写成 App\Nova\user.php(小写)或 App\Nova\UserResource.php(类名带 Resource),都会导致侧边栏不显示该资源。
- 正确路径:
app/Nova/User.php→ 类名必须是User - 模型在
App\Models\Customer?资源仍叫Customer,别加前缀 - 继承必须是
Laravel\Nova\Resource,不是Model或Controller - 必须实现
model()方法,返回字符串类名,如return Customer::class;
fields() 里用点号访问关联字段时,必须重写 indexQuery()
写 Text::make('Company', 'company.name') 看似简洁,但 Nova 默认不做 eager load,列表页会为每行触发一次 company 查询——100 条记录 = 100 次 SQL。
- 修复方式:在 Resource 类中重写
indexQuery(),显式加with() - 示例:
public static function indexQuery(NovaRequest $request, $query) { return $query->with('company'); } - 注意:
relatableQuery()是下拉选择、搜索弹窗等场景用的,别和indexQuery()混用 - 多个关联?
with('company', 'category', 'tags'),但别无脑全加,按需加载
字段名不能直接套用模型属性名,尤其涉及计算或关联时
Text::make('name') 在模型有 $fillable = ['name'] 时能读写,但一旦字段是计算值、JSON 内嵌、或来自关联表,就会出错或显示空。
- 显示关联字段:用
Text::make('Owner', 'user.name'),前提是user()关系已定义 - 显示计算字段(只读):用闭包,如
Text::make('Status', fn () => $this->active ? 'Active' : 'Inactive') - 写入 JSON 字段?得用
Textarea::make('Options')->resolveUsing(...)->fillUsing(...)手动处理序列化 - 字段名重复?Nova 会覆盖——比如同时定义了
ID::make()和Text::make('id'),后者会把 ID 当文本渲染
权限未生效或资源不显示?先查 NovaServiceProvider 的 tools() 方法
资源类建好了,app/Nova/User.php 也写对了,但登录后侧边栏还是没 “Users” ——大概率是 NovaServiceProvider 没注册它。
- 默认生成的
tools()方法是空数组,必须手动添加:public function tools() { return [ new \App\Nova\User, new \App\Nova\Post, ]; } - 别漏掉命名空间,
\App\Nova\User前的反斜杠不能少 - 使用
@vyuldashev/nova-permission等扩展时,权限控制逻辑写在canSee()或authorizedToView()里,不是靠路由中间件 - 开发中改了
tools(),记得清 Laravel 缓存:php artisan config:clear
最常被跳过的其实是 indexQuery() 重写和 tools() 手动注册——这两步不落实,再漂亮的字段配置也跑不起来。











