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

时间:2017-06-28 16:37:37

标签: php mysql sql laravel

我使用Chart.js显示每个月的预订数量。这是我的查询。它工作正常。 我的问题是,如果一个月没有预订,那么它没有显示任何东西。没有零价值。在图表上我得到像

这样的值
  • 1月23日
  • 2月34日
  • 4月23日
  • 5月25日
  • 7月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

3 个答案:

答案 0 :(得分:1)

当没有记录记录时,你必须设置为零。

更改您的查询:

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

希望你明白。

答案 1 :(得分:1)

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

你可以做的是使用DatePeriod和Laravel的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 }}应该可以正常工作。

希望这有帮助!

答案 2 :(得分:0)

在刀片中,您可以简单地使用

@foreach ($graph as $dat) 
    {{ $dat->totalbook ? $dat->totalbook : 0 }},
@endforeach

这会检查 $dat->totalbook 是否存在,如果存在则显示值,否则显示 0。