Как запросить пользователей и сгруппировать их по возрасту, используя laravel eloquent

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

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

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

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

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

введите описание изображения здесь

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

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

Всего 2 ответа

Автоматический диспенсер мыльной пены от xiaomi.


Я собираюсь использовать комбинацию 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); 

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

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

 => IlluminateSupportCollection {#2948 all: [ "25-35" => 1, "36-45" => 2, "46+" => 1, ], } 

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

$groups = [ཎ-24' =>, ཕ-35', ..., ཀྵ'];

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

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

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

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


Есть идеи?

10000