如何使用laravel雄辩地查询用户并将其分组在年龄范围内

时间:2019-05-15 15:17:58

标签: php laravel laravel-5 eloquent

我想查询用户并将其按年龄段分组

这是我到目前为止所做的

<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>

这是我从上面的查询中得到的

enter image description here

现在想按年龄段获取收藏和订购

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

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

3 个答案:

答案 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();