我想查询用户并将其按年龄段分组
这是我到目前为止所做的
<div class="styled-input-single">
<input type="checkbox" name="case-1" id="1" />
<label for="1">1</label>
</div>
<div class="styled-input-single">
<input type="checkbox" name="case-2" id="2" />
<label for="2">2</label>
</div>
这是我从上面的查询中得到的
现在想按年龄段获取收藏和订购
User::applicant()->get()
->groupBy(function ($item) {
return Carbon::parse($item->dob)->age;
})
->map(function ($collection) {
return $collection->count();
});
答案 0 :(得分:3)
我将使用map()
和mapToGroups()
的组合,我敢肯定肯定有一种更简单的方法,但这对我很有趣:
javax.sql.DataSource ds = ...; // initialize DataSource
org.jooq.Configuration configuration = Configuration.derive(ds);
DSLContext dslContext = DSL.using(configuration);
Record r = dslContext.selectFrom(...).where.(...).fetchOne();
其背后的想法是为每个记录添加一个属性,其值对应于其年龄范围,然后通过此键对它们进行分组,以创建一组按范围分组的用户数组,以最终计算其中每个子数组的元素这个键。
这应该返回如下内容:
$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);
答案 1 :(得分:3)
这是未经测试的解决方案(需要重构:
$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();
首先,您需要创建所需的组数组,最后一个组不应包含+
。
然后您将获得所有申请人。
然后,您遍历每个组,找出申请人是否在其范围内,并进行计数。这被映射到结果数组。
答案 2 :(得分:0)
尝试一下
$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();