为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用laravel eloquent查询用户并按年龄范围对他们进行分组

如何使用laravel eloquent查询用户并按年龄范围对他们进行分组

PHP
弑天下 2021-06-11 18:49:26
我想查询用户并按年龄范围对他们进行分组这是我到目前为止所做的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
查看完整描述

3 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

我将使用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,

     ],

   }


查看完整回答
反对 回复 2021-06-19
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

这是一个未经测试的解决方案(需要重构:


$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();

首先,您需要创建一组您需要的组,最后一组不应有+.


然后你会得到所有的申请者。


然后,您遍历每个组,找出申请人是否在其范围内,并获得计数。这被映射到结果数组。


查看完整回答
反对 回复 2021-06-19
?
DIEA

TA贡献1820条经验 获得超2个赞

试试这个


$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();


查看完整回答
反对 回复 2021-06-19
  • 3 回答
  • 0 关注
  • 259 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号