Laravel Nova指标如何指定completed_by_manager_at为时间统计字段?
解决Laravel Nova数值指标替换时间统计字段的问题
方法一:直接在指标类中自定义统计逻辑(最直接)
打开你生成的app/Nova/Metrics/OrdersCompleted.php,修改calculate方法,完全自定义时间范围过滤逻辑,摆脱Nova默认的created_at限制:
use Carbon\Carbon; use Illuminate\Http\Request; use App\Models\Order; class OrdersCompleted extends Value { public function calculate(Request $request) { // 先调用已有的OnlyCompleted scope筛选已完成订单 $query = Order::onlyCompleted(); // 根据Nova传入的range参数匹配对应时间范围 match ($request->range) { 'today' => $query->whereDate('completed_by_manager_at', today()), 'yesterday' => $query->whereDate('completed_by_manager_at', yesterday()), 'week' => $query->whereBetween('completed_by_manager_at', [now()->startOfWeek(), now()->endOfWeek()]), 'month' => $query->whereBetween('completed_by_manager_at', [now()->startOfMonth(), now()->endOfMonth()]), 'year' => $query->whereBetween('completed_by_manager_at', [now()->startOfYear(), now()->endOfYear()]), // 选择自定义范围时,Nova会自动传入start和end参数 'custom' => $query->whereBetween('completed_by_manager_at', [ Carbon::parse($request->start)->startOfDay(), Carbon::parse($request->end)->endOfDay() ]), }; return $this->result($query->count()); } // 其他默认方法(如name、uriKey)保持不变即可 }
方法二:通过自定义Scope封装时间范围逻辑
如果想把时间过滤逻辑封装到模型Scope里,按以下步骤操作:
- 在
Order模型中添加自定义Scope:
use Carbon\Carbon; class Order extends Model { // 已有的OnlyCompleted scope... public function scopeGetCompletedByManagerAtBetweenDates($query, $start, $end) { return $query->whereBetween('completed_by_manager_at', [ Carbon::parse($start)->startOfDay(), Carbon::parse($end)->endOfDay() ]); } }
- 在指标类中调用该Scope:
public function calculate(Request $request) { $query = Order::onlyCompleted(); // 根据range参数生成对应的起止日期 [$start, $end] = match ($request->range) { 'today' => [today(), today()], 'yesterday' => [yesterday(), yesterday()], 'week' => [now()->startOfWeek(), now()->endOfWeek()], 'month' => [now()->startOfMonth(), now()->endOfMonth()], 'year' => [now()->startOfYear(), now()->endOfYear()], 'custom' => [$request->start, $request->end], }; $query->getCompletedByManagerAtBetweenDates($start, $end); return $this->result($query->count()); }
关键提示
Nova的range参数固定有这些取值:today、yesterday、week、month、year、custom。当用户选择自定义时间范围时,请求会自动携带start和end两个日期参数,直接用Carbon解析即可。
内容的提问来源于stack exchange,提问作者mstdmstd
相关产品推荐
相关产品推荐

