【问题标题】:Get all orders between two dates per day获取每天两个日期之间的所有订单
【发布时间】:2016-03-22 11:23:37
【问题描述】:

假设我的数据库中有 3 个订单

  1-1-16
  1-4-16
  1-15-16

我想要做的是显示两个日期之间每天订单的图​​表。例如

1-1-16 / 1-5-16

我想要的是

 1-1-16      ,1
 1-2-16      ,0
 1-3-16      ,0
 1-4-16      ,1
 1-5-16      ,0

如果没有订单,我应该如何获取日期的数据? 我有一个带有 created_at 字段的 Order 模型,我可以在其中运行查询。

目前我得到的订单按日期分组,如下所示:

$variable = Order::select('created_at', DB::raw('sum(total) as totals'), DB::raw('sum(shipping) as totalshipping'))->groupBy(DB::raw('DAY(created_at)'))->OrderBy('created_at', 'desc')->get();

这给了我每天的订单,但不返回没有订单的天数

【问题讨论】:

  • 你有没有尝试过?
  • 还有,你如何显示图表?你为你的图表使用了一个接受 json 的 js 插件吗?
  • @gokigooooks 我将在几分钟后发布我的代码,我可以按日期对订单进行分组,但前提是已经有订单。 js 插件与获取数据无关,但我已将其添加到上下文中。

标签: laravel laravel-5.1


【解决方案1】:

我会这样做:

use Carbon\Carbon;   
$oders = Order::select('id', 'created_at')
    ->get()
    ->groupBy(function($date) {
        return Carbon::parse($date->created_at)->format('d'); // grouping by date
});

对于您没有订单的日期:

$start = new DateTime( '2016-01-01' );
$end = new DateTime( '2016-05-01' );
$interval = DateInterval::createFromDateString('1 day');
$range = new DatePeriod($start, $interval, $end);

foreach ( $range as $day )
  // check if the $orders[i]->created_at !=  $day->format("Y-m-d")

【讨论】:

  • 感谢您的建议,但这不会给我没有订单的日期的结果。
【解决方案2】:

我建议在您想要的范围内创建日期,然后在日期内附加订单

用碳创建范围

注意这是假设您使用具有开始日期、结束日期和订购日期的碳对象。

如果不是我强烈建议你使用它们,它们是 laravel 内置的。 timestamps(created_at,updated_at) 默认是碳对象。

$start_date = Carbon\Carbon::createFromFormat('d-m-Y', '11-06-2016'); 
$end_date = Carbon\Carbon::createFromFormat('d-m-Y', '11-23-2016');
$date_range = [];


//containing the dates from the query and count of orders
$i = 0;
for($date = $start_date; $date->lte($end_date); $date->addDay()) {

    $date_range[$i]['date'] = $date->format('m-d-Y');
    foreach($orders as $order)
    {
        if($date==$orders->created_at)
        {
             $date_range[$i]['orders'] = $order->totals;  
        }
        else
        {
             $dates_range[$i]['orders'] = 0;
        }
    }
    $i++;
}

现在你可以做类似的事情

   foreach($date_range as $date)
   {
       echo 'date: '.$date[date]. orders : .$date['orders'];
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 2017-09-17
    • 1970-01-01
    相关资源
    最近更新 更多