首页 > 解决方案 > 如何使用 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

标签: phplaravellaravel-5eloquent

解决方案


我将使用map()and的组合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($user->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,
     ],
   }

推荐阅读