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
相关产品推荐
相关产品推荐

