Laravel:每日求和(按日期分组),然后用空行保留日期

Laravel:每日求和(按日期分组),然后用空行保留日期,laravel,Laravel,堆栈溢出 我有工作laravel函数,它可以得到过去30天的每日销售总额。 我将使用这些数据构建一个图表,因此我需要得到日期,即使它是空的,并给它们一个值“0”作为它们的总和 这是我的代码(它正在工作,但只返回不为空的日期) 公共函数getDaily(){ $startDate=碳::现在()->子天(30); $endDate=Carbon::now(); $all_dates=array(); 对于($i=0;$itoDateString(); $startDate->addDay(); $

堆栈溢出

我有工作laravel函数,它可以得到过去30天的每日销售总额。 我将使用这些数据构建一个图表,因此我需要得到日期,即使它是空的,并给它们一个值“0”作为它们的总和

这是我的代码(它正在工作,但只返回不为空的日期)

公共函数getDaily(){ $startDate=碳::现在()->子天(30); $endDate=Carbon::now(); $all_dates=array(); 对于($i=0;$itoDateString(); $startDate->addDay(); $sales=DB::表('sales_details') ->选择(DB::raw('sum(amount_due)as daily'),DB::raw('date(created_at)as date')) ->分组人(“日期”) ->订购人('date','desc') ->get(); } 返回$sales; } 试试这个:

$sales=DB::table('sale\u details')
->其中('created_at',[$startDate,$endDate])
->挑选([
DB::raw(‘每日应付金额’),
DB::raw('date(created_at)as date'),
])
->分组人(“日期”)
->订购人('date','desc')
->拔毛(‘每日’、‘日期’)
->toArray();
$period=new CarbonPeriod($startDate,$1天,$endDate);
//填零
foreach($期间为$日期){
如果(!isset($sales[$date->toDateString()])){
$sales[$date->toDateString()]=0;
}
}
另一种解决方案是使用数据库生成的一系列日期(pgsql示例:)并将其与结果关联起来。

尝试以下方法:

$sales=DB::table('sale\u details')
->其中('created_at',[$startDate,$endDate])
->挑选([
DB::raw(‘每日应付金额’),
DB::raw('date(created_at)as date'),
])
->分组人(“日期”)
->订购人('date','desc')
->拔毛(‘每日’、‘日期’)
->toArray();
$period=new CarbonPeriod($startDate,$1天,$endDate);
//填零
foreach($期间为$日期){
如果(!isset($sales[$date->toDateString()])){
$sales[$date->toDateString()]=0;
}
}

另一种解决方案是使用数据库生成的一系列日期(pgsql示例:)并将其与结果关联。

要获取对象数组,可以使用good Collection的方法:

$sales=DB::table('sale\u details')
->其中('created_at',[$startDate,$endDate])
->挑选([
DB::raw(‘每日应付金额’),
DB::raw('date(created_at)as date'),
])
->分组人(“日期”)
->得到()
->keyBy(“日期”);
$period=new CarbonPeriod($startDate,$1天,$endDate);
//填零
foreach($期间为$日期){
$dateString=$date->toDateString();
如果(!$sales->has($dateString)){
$sales->put($dateString,['date'=>$dateString,'daily'=>0]);
}
}
//转换为关联数组
$sales=$sales->values()->toArray();

要获取对象数组,可以使用good Collection的方法:

$sales=DB::table('sale\u details')
->其中('created_at',[$startDate,$endDate])
->挑选([
DB::raw(‘每日应付金额’),
DB::raw('date(created_at)as date'),
])
->分组人(“日期”)
->得到()
->keyBy(“日期”);
$period=new CarbonPeriod($startDate,$1天,$endDate);
//填零
foreach($期间为$日期){
$dateString=$date->toDateString();
如果(!$sales->has($dateString)){
$sales->put($dateString,['date'=>$dateString,'daily'=>0]);
}
}
//转换为关联数组
$sales=$sales->values()->toArray();

wow!谢谢,非常好。我得到了这样的结果:{“2020-05-05”:3307,“2020-04-28”:12.2,“2020-04-26”:460.47,“2020-04-05”:0,“2020-04-06”:0,“2020-04-07”:0,“2020-04-12”:0您能再次帮助我如何以数组的形式访问这种结果吗?我将在图表中使用它们,因此我需要以数组1的形式获取日期,以数组2的形式获取总和值。在ajax或js@regit发布了新的答案。哇!谢谢,非常有效。我得到了这样的结果:{“2020-05-05”:3307,“2020-04-28”:12.2,“2020-04-26”: 460.47, "2020-04-05": 0, "2020-04-06": 0, "2020-04-07": 0, "2020-04-12": 0, ........ }您能再次帮助我如何以数组的形式访问这种结果吗?我将在图表中使用它们,因此我需要以数组1的形式获取日期,以数组2的形式获取总和值。在ajax或js@regit发布了下面的新答案。嗨@zlodes我收到了这个错误:“ErrorException未定义索引:2020-04-05”我正在尝试解决这个问题,抱歉,我只是在隔离期间学习了laravel和js…很好!不要停止!:)再次您好zlodes,这方面需要您的帮助,有没有办法从该函数中排序日期?因为查询的第一部分只获取带有值的日期,而在第二部分将“放置”所有带有0值的日期,从而生成随机日期!您可以使用Laravel集合中的
sort
方法,最后一行代码如下:
$sales=$sales->values()->sortBy('date')->toArray()
如果需要按桌面排序,可以使用方法
sortByDesk
而不是
sortBy
。Docs reference:已经尝试过了,但不起作用:(我会自己尝试解决这个问题。谢谢!感谢您的帮助!你好@zlodes我收到了这个错误:“ErrorException Undefined index:2020-04-05”我正在尝试解决它,抱歉,我只是在隔离期间学习了laravel和js…很好!不要停止!:)你好,zlodes,需要您在这方面再次提供帮助,是否有方法从该函数中排序日期?因为查询的第一部分只获取带有值的日期,而在第二部分将“放置”所有带有0值的日期,从而生成随机日期!您可以使用Laravel集合中的
sort
方法,最后一行代码如下:
$sales=$sales->values()->sortBy('date')->toArray()
如果需要按桌面排序,可以使用方法
sortByDesk
而不是
sortBy
。文档参考:已尝试过,但不起作用:
public function getDaily() {
    $startDate = Carbon::now()->subDays(30);
    $endDate = Carbon::now();
    $all_dates = array();

   for($i = 0;$i<=30;$i++)
   {
        $all_dates[] = $startDate->toDateString();
        $startDate->addDay();
        $sales=DB::table('sale_details')
        ->select(DB::raw('sum(amount_due) as daily'),DB::raw('date(created_at) as date'))
        ->groupBy('date')
        ->orderBy('date','desc')
       ->get();
   }
    return $sales;
}