如果找不到值,如何自定义Laravel WhereBetween

时间:2017-07-27 04:33:00

标签: laravel

我正在使用像这样的Laravel WhereBetween

$from = '2015-01-02';
$to = '2015-01-30';
$users = User::whereBetween('created_at', [$from,$to])->get();

如果在用户模型中找不到日期值,那么日期将不会显示正确吗?

我仍然想显示日期,即使是未找到的日期,然后我将值设置为0。

然后输出就像这样

[
    {'2015-01-02': 201},
    {'2015-01-03': 0},
    {'2015-01-04': 0},
    {'2015-01-05': 7},
    ...
    {'2015-01-30': 0}
]

感谢。

1 个答案:

答案 0 :(得分:0)

您首先需要执行以下查询,以便在给定范围内创建所有用户

$data = User::select([
    DB::raw('DATE(created_at) AS date'),
    DB::raw('COUNT(id) AS count'),
 ])
 ->whereBetween('created_at', [$from,$to])
 ->groupBy('date')
 ->orderBy('date', 'ASC')
 ->get();

通过上述查询,您将获得每天的用户数,如果当天没有用户创建,则不会提供 0 值。

现在,您需要做的是将上面的集合更改为数组,如果没有用户创建,则插入 0 值。

$userCount = $data->toArray();

$dataByDay = array();

foreach($userCount as $count){
    $dataByDay[$count->date] = $count->count;
}

现在,将零值插入:

$dateFrom = Carbon::parse($from)->format('Y-m-d');
$dateTo = Carbon::parse($to)->format('Y-m-d');

$days = $dateTo->diffInDays($dateFrom);

for($i=0; $i<$days; $i++){
    $dateString = $dateFrom->format('Y-m-d');
    if(!isset($chartDataByDay[ $dateString ] {
        $dataByDay[ $dateString ] = 0;
    }
}

现在,$dataByDay数组可以提供您想要的内容。

希望你明白。