Nova v4 Lens中如何获取查询结果用于ChartJS卡片开发?
在Nova v4 Lens卡片中使用动态查询结果的解决方案
在Nova v4的Lens里,直接调用$this->query()只能拿到模型的原始查询,无法获取Lens已经过滤后的上下文数据。要解决这个问题,你可以通过请求对象获取经过Lens处理后的查询构建器:
关键方法:$request->newQuery()
Nova的NovaRequest(Lens场景下实际是LensRequest)提供的newQuery()方法,会返回已经应用了当前Lens所有过滤条件、排序规则的查询实例,用它就能拿到Lens展示的真实数据。
改造后的代码示例
public function cards(NovaRequest $request) { // 一次性获取经过Lens过滤后的结果,避免重复查询 $records = $request->newQuery()->get(); return [ (new StackedChart()) ->title('Revenue') ->series($records->map(function ($record) { return [ 'barPercentage' => 0.5, 'label' => $record->name, 'backgroundColor' => $record->color, 'data' => $record->data, ]; })->toArray()) ->options([ 'xaxis' => [ 'categories' => $records->map(fn($record) => $record->created_at->day)->values()->toArray(), ], ]), ]; }
额外优化建议
- 如果数据量较大,建议用
select()指定需要的字段,减少数据库查询开销:$records = $request->newQuery()->select('name', 'color', 'data', 'created_at')->get(); - 若图表数据不需要实时更新,可以给查询结果添加缓存,提升页面加载速度。
内容的提问来源于stack exchange,提问作者eComEvo
相关产品推荐
相关产品推荐

