You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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里,按以下步骤操作:

  1. 在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()
        ]);
    }
}
  1. 在指标类中调用该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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 22:45:03