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

Laravel查询构造器select as中修改日期为Jalali实现年销售统计

你猜测的直接把verta(created_at)->year写在DB::raw里是行不通的,因为DB::raw的内容会直接传入数据库执行,数据库无法识别PHP层面的Verta方法。下面给出两种可行实现方案:


方案1:小数据量场景,用Laravel集合+Verta处理

不需要调整数据库配置,直接用Verta在PHP层面做日期转换、分组统计:

// 先查询出所有符合条件的订单
$orders = DB::table('orders')
    ->select('total', 'created_at')
    ->where('pay_status', 'paid')
    // 如果你原来的$date_from、$date_to是公历,这里保留原有条件即可;如果是波斯历,需要先转成公历再传入
    ->whereBetween('created_at', [$date_from, $date_to])
    ->get();

// 用集合分组统计,基于Verta转换的波斯历年份
$orderStats = $orders->groupBy(function($item) {
    return verta($item->created_at)->year;
})->map(function($group, $year) {
    return [
        'sum' => $group->sum('total'),
        'data' => $year // 对应波斯历年份
    ];
})->values();

方案2:大数据量性能优化方案,SQL层面实现转换

如果数据量较大,全量查询后再分组性能不足,可以在数据库层面提前实现波斯历年份转换函数,比如MySQL可以自定义JALALI_YEAR函数,之后直接在查询中调用即可:

$Orders = DB::table('orders')
    ->select(
        DB::raw('sum(total) as sum'), 
        DB::raw('JALALI_YEAR(created_at) as data')
    )
    ->where('pay_status', 'paid')
    ->whereBetween('created_at', [$date_from, $date_to])
    ->groupBy('data')
    ->get();

注意事项

如果你的查询条件$date_from、$date_to是波斯历格式,需要先通过verta转成公历格式再传入where条件,避免查询范围出错。

内容的提问来源于stack exchange,提问作者h h

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:06:02