小编典典

如果Laravel中Count为零,如何获取记录

sql

我使用Chart.js来显示每个月的预订数量。这是我的查询。一切正常。我的问题是,如果一个月没有预订,那么它什么也不会显示。没有零值。在图表上,我得到像

  • 一月23
  • 二月34
  • 四月23
  • 五月25
  • 七月42

图表中显示了三月和六月。.在没有预订的月份中,如何获得零值。

$graph = DB::table('bookings')
    ->select(DB::raw('MONTHNAME(created_at) as month'), DB::raw("DATE_FORMAT(created_At,'%M %Y') as monthNum"),    DB::raw('count(*) as totalbook'))
    ->groupBy('monthNum')
    ->orderBy('created_at', 'asc')
    ->get();

要获得几个月的时间,

@foreach ($graph as $dat) 
                "{!! $dat->monthNum !!}",
                @endforeach`

并获得预订号

@foreach ($graph as $dat) 
                {!! $dat->totalbook !!},
                @endforeach

阅读 265

收藏
2021-03-23

共1个答案

小编典典

MySQL不会填写不可用的月份,它只会根据可用的内容进行分组,然后为您提供这些结果。

您可以做的是使用DatePeriodLaravel的Collection课程:

$results = DB::table('bookings')
    ->selectRaw("DATE_FORMAT(created_At,'%Y-%m-01') as monthNum, count(*) as totalbook")
    ->orderBy('monthNum')
    ->groupBy('monthNum')
    ->get();

$results = collect($results)->keyBy('monthNum')->map(function ($item) {
    $item->monthNum = \Carbon\Carbon::parse($item->monthNum);

    return $item;
});

$periods = new DatePeriod($results->min('monthNum'), \Carbon\CarbonInterval::month(), $results->max('monthNum')->addMonth());

$graph = array_map(function ($period) use ($results) {

    $month = $period->format('Y-m-d');

    return (object)[
        'monthNum'  => $period->format('M Y'),
        'totalbook' => $results->has($month) ? $results->get($month)->totalbook : 0,
    ];

}, iterator_to_array($periods));

请注意,我monthNum在查询中进行了更新,因为它将在以后重新格式化。

另外,您应该为此使用刀片原始标签({!! !!}),因为它{{ $dat->totalbook }}绝对可以正常工作。

希望这可以帮助!

2021-03-23