Как запросить пользователей и сгруппировать их по возрасту, используя laravel eloquent - PullRequest
0 голосов
/ 15 мая 2019

Я хочу запросить пользователей и сгруппировать их по возрасту

Это то, что я сделал до сих пор

User::applicant()->get()
                ->groupBy(function ($item) {
                    return Carbon::parse($item->dob)->age;
                })
                ->map(function ($collection) {

                    return $collection->count();
                });

Это то, что я получил из запроса выше

enter image description here

Теперь хочу получить коллекцию и заказ по возрасту

18-24: 1,
25-35: 5,
36-45: 89,
46+ : 84

Ответы [ 2 ]

4 голосов
/ 15 мая 2019

Это непроверенное решение (для которого потребуется рефакторинг:

$groups = ['18-24' =>, '25-35', ..., '45'];

$applicants = User::applicant()->get();

$groups = collect($groups)
    ->map(function ($range, $key) use ($applicants) {
        $rangeLimits = explode('-', $range);

        $count = $applicants->filter(function ($applicant, $key) use ($rangeLimits) {
            $age = Carbon::parse($applicant->dob)->age;

            $verdict = $age >= $rangeLimits[0];

            if (isset($rangeLimits[1])) {
                $verdict = $age <= $rangeLimits[1];
            }

            return $verdict
        })->count();

        $range = ! isset($rangeLimits[1]) ? $range . '+' : $range;

        return [ $range => $count ]; 
    })->flatten()->all();

Сначала вам нужно создать массив групп, который вам нужен, последняя группа не должна иметь +.

Затем вы получите всех заявителей.

Затем вы просматриваете каждую группу и выясняете, находятся ли заявители в ее диапазоне, и получаете счет. Это сопоставлено с результирующим массивом.

3 голосов
/ 15 мая 2019

Я собираюсь использовать комбинацию map() и mapToGroups(), я почти уверен, что должен быть более простой способ, но мне было весело:

$ranges = [ // the start of each age-range.
    '18-24' => 18,
    '25-35' => 25,
    '36-45' => 36,
    '46+' => 46
];

$output = User::applicant()
    ->get()
    ->map(function ($user) use ($ranges) {
        $age = Carbon::parse($item->dob)->age;
        foreach($ranges as $key => $breakpoint)
        {
            if ($breakpoint >= $age)
            {
                $user->range = $key;
                break;
            }
        }

        return $user;
    })
    ->mapToGroups(function ($user, $key) {
        return [$user->range => $user];
    })
    ->map(function ($group) {
        return count($group);
    });
    ->sortKeys();

dd($output);

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

Это должно вернуть что-то вроде:

=> Illuminate\Support\Collection {#2948
     all: [
       "25-35" => 1,
       "36-45" => 2,
       "46+" => 1,
     ],
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...