Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用laravel eloquent查询用户并将其按年龄范围分组_Php_Laravel_Laravel 5_Eloquent - Fatal编程技术网

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