Как я могу получить все даты, даже даты, у которых нет записи, красноречиво с группой по? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть метод, который получает параметр месяца, чтобы выбрать строки этого месяца из таблицы пользователей.Я хочу показать количество зарегистрированных пользователей за месяц.

public function registeredUsersDaily($month)
{
     $countOfDailyRegisteredUsersForAMonth = User::user()
        ->where(DB::raw('created_at'), '=', $month)
        ->groupBy('date')
        ->orderBy('date')
        ->get([
            DB::raw('DATE(created_at) as date'),
            DB::raw('COUNT(*) as count')
        ]);
    dd($countOfDailyRegisteredUsersForAMonth);
}

Это возвращает счет только для дат, которые существуют в таблице пользователей, поэтому я хочу иметь ноль для дат, которые не существуют.

|date|count|  
| 5  | 10  |  
| 15 | 3   | 

Я хочу получить такой результат:

|date   |count  |
| 1     | 0     |
| 2     | 0     |
| 3     | 0     |
| 4     | 0     |
| 5     | 10    |
| 6     | 0     |
| 7     | 0     |
| 8     | 0     |
| 9     | 0     |
| 10    | 0     |
| 11    | 0     |
| 12    | 0     |
| 13    | 0     |
| 14    | 0     |
| 15    | 3     |

....

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Пожалуйста, проверьте как это

$dateValues = array_column($countOfDailyRegisteredUsersForAMonth, "date");
$maxDate    = max($dateValues);
$likeYouWant=[];
for ($i = 1; $i <= $maxDate; $i++)
{
    $likeYouWant[] = ["date" => $i, "count" => in_array($i, $dateValues) ? $countOfDailyRegisteredUsersForAMonth[array_search($i, $dateValues)]["count"] : 0];
}
print_r($likeYouWant);
0 голосов
/ 04 марта 2019

Из того, что я получил из комментариев: я думаю, что лучше всего здесь посчитать количество пользователей, созданных каждый день месяца.Это даст вам нули в случае, если никто не зарегистрирован на данную дату.При этом вы, вероятно, будете циклически проходить по датам, проверяя общее число пользователей, зарегистрированных на каждую дату.

Например, давайте попробуем создать пользователей, созданных за последние 30 дней:

$results = [];

$startOfDay = now()->createMidnightDate();

for($i=0; $i<=30; $i++)
{
    $total_count = User::whereBetween('created_at', [$startOfDay->subDays($i-1), $startOfDay->subDays($i)])
        ->count();

    array_push($results[ $startOfDay->subDays($i)->format('d')], $total_count);
}

С этим я думаю, что теперь вы можете работать с результатами из массива.

0 голосов
/ 04 марта 2019

Если вы хотите установить дату по умолчанию, вы можете указать это в этом файле migration или вы также можете сделать это в своем model, откуда вы можете получать данные, когда пользователь не указал дату.Вы также можете сослаться на это подробнее

Как передать значения по умолчанию в контроллер путем маршрутизации в Laravel 5?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...