简体   繁体   中英

How to get the record if Count is zero in Laravel

Im using Chart.js to show the number of bookings for each month. This is my query. It is working fine. My problem is if there is no booking in a month then it doesnt show anything. No zero value. On the chart i get the value like

  • January 23
  • February 34
  • April 23
  • May 25
  • July 42

March and June are shown on the chart..How can i get the value Zero for months where there is no booking..

$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();

To get months,`

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

And to get booking numbers

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

MySQL will not fill in the months that aren't available, it will simply group by what you have available and then give you those results.

What you could do is use DatePeriod and Laravel's Collection class:

$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));

Please note I have updated monthNum in the query as it will be reformatted later.

Also, you should need to use the blade raw tags ( {!! !!} ) for this as {{ $dat->totalbook }} should work absolutely fine.

Hope this helps!

You have to set zero when there are no records for counting.

Change your query something like this:

$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();

Hope you understand.

In blade you can simply use

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

This checks if $dat->totalbook exists and if it does then displays the value, else will show 0.

Use eloquent

Model::withCount('members')
  ->having('members_count', '>', 0)
  ->get();

Use query builder doc

$users = DB::table('users')
                ->groupBy('account_id')
                ->having('account_id', '>', 100)
                ->get();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM