使用 Laravel 的查询构建器填充日期序列中的空项目

问题描述 投票:0回答:4

我使用 Chart.js 来显示每个月的预订数量。这是我的查询。运行良好:

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

我的问题是,如果一个月内没有预订,那么它不会显示任何内容。没有零值。在图表上我得到如下值

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

但是图表上根本没有显示三月和六月。没有预订的月份如何获得零价值?

php mysql laravel laravel-query-builder
4个回答
3
投票

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 }}
应该可以正常工作。

希望这有帮助!


0
投票

没有记录时必须清零。

更改您的查询,如下所示:

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

希望你能理解。


0
投票

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

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

这会检查

$dat->totalbook
是否存在,如果存在则显示该值,否则将显示 0。


-1
投票

使用雄辩的语言

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

使用查询生成器doc

$users = DB::table('users')
                ->groupBy('account_id')
                ->having('account_id', '>', 100)
                ->get();
© www.soinside.com 2019 - 2024. All rights reserved.