我使用Chart.js来显示每个月的预订数量。这是我的查询。一切正常。我的问题是,如果一个月没有预订,那么它什么也不会显示。没有零值。在图表上,我得到像
图表中显示了三月和六月。.在没有预订的月份中,如何获得零值。
$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
MySQL不会填写不可用的月份,它只会根据可用的内容进行分组,然后为您提供这些结果。
您可以做的是使用DatePeriodLaravel的Collection课程:
DatePeriod
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在查询中进行了更新,因为它将在以后重新格式化。
monthNum
另外,您应该为此使用刀片原始标签({!! !!}),因为它{{ $dat->totalbook }}绝对可以正常工作。
{!! !!}
{{ $dat->totalbook }}
希望这可以帮助!