Php 如何使用laravel eloquent查询用户并将其按年龄范围分组
我想查询用户并按年龄范围对他们进行分组Php 如何使用laravel eloquent查询用户并将其按年龄范围分组,php,laravel,laravel-5,eloquent,Php,Laravel,Laravel 5,Eloquent,我想查询用户并按年龄范围对他们进行分组 18-24: 1, 25-35: 5, 36-45: 89, 46+ : 84 这就是我到目前为止所做的 User::applicant()->get() ->groupBy(function ($item) { return Carbon::parse($item->dob)->age; })
18-24: 1,
25-35: 5,
36-45: 89,
46+ : 84
这就是我到目前为止所做的
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
我将使用和的组合,我很确定一定有更简单的方法,但这对我来说很有趣: $ranges=[//每个年龄段的开始。 '18-24' => 18, '25-35' => 25, '36-45' => 36, '46+' => 46 ]; $output=用户::申请人 ->得到 ->mapfunction$用户使用$范围{ $age=Carbon::解析$user->dob->age; foreach$范围为$key=>$breakpoint { 如果$breakpoint>=$age { $user->range=$key; 打破 } } 返回$user; } ->mapToGroupsfunction$user,$key{ 返回[$user->range=>$user]; } ->mapfunction$组{ 返回计数$组; } ->排序键; dd$产出; 这背后的想法是向每个记录添加一个属性,该属性的值与它们的年龄范围相对应,然后按此键对它们进行分组,创建一组按范围分组的用户数组,最后计算此键内每个子数组的元素数 这将返回类似于: =>照明\支持\收集{2948 全部:[ 25-35 => 1, 36-45 => 2, 46+ => 1, ], }
这是一个未经测试的解决方案,需要重构:
$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();
首先,您需要创建所需的组数组,最后一个组不应具有+
然后你得到所有的申请者
然后,你在每个组中循环,找出申请者是否在其范围内,并获得计数。这将映射到结果数组。请尝试此操作
$users = \DB::table('users')
->select(DB::raw('concat(10*floor(age/10), \'-\', 10*floor(age/10) + 9) as `range`, count(*) as `numberofusers`'))
->groupBy('range')
->get();
你有你想要的具体年龄范围吗?也有0-18岁吗?是的,我已经编辑了我的问题@thisiskelvinNo有0-18岁,因为这是招聘代理网站,我们不希望申请者低于18岁要清楚,这是针对这些年龄组的人数,而不是将实际的人员分组在一起?我希望将他们合并在25-46=>5的范围内@HCK@TheodoryFaustine正如你在我文章顶部看到的,我指定了一组年龄断点,如果你想要25-46的范围,只需在$ranges数组中包含:[……,25,47,…]就可以了。顺便说一句,我忘了对键排序,已修复响应。@HCK读取pdf!非常好,仍然需要重新访问一些部分。@HCK在twitter上添加了您,btwThank you@thisisKelvin,但我查询失败,因为变量$max,我必须将其初始化为0吗?@TheodoryFaustine更新,应该是$rangeLimits[1],非常感谢@thisisKelvin