Laravel计数多级组

问题描述

项目

[created_at => 2020-08-12 06:00:00,type =>2]
[created_at => 2020-08-12 07:00:00,type =>1]
[created_at => 2020-08-12 08:00:00,type =>1]
[created_at => 2020-08-11 12:00:00,type =>3]
[created_at => 2020-08-11 21:00:00,type =>3]

我想编写(Laravel 7)查询,返回的内容如下:

[
["date"=>"2020-08-12","amount"=>3,"type1"=>2,"type2"=>1],["date"=>"2020-08-11","amount"=>2,"type3"=>2],]

如何分组并依靠多层次?

解决方法

您可以使用少量查询构建器和一些集合来实现此目的:

return DB::table('items')
         ->selectRaw('DATE_FORMAT(created_at,"%Y-%m-%d") as date,type,COUNT(type) as count')
         ->groupBy('date','type')
         ->orderBy('date','desc')
         ->get()
         ->reduce(function ($summary,$item) {
             if (! $summary->has($item->date)) {
                 $summary->put($item->date,collect([
                     'date' => $item->date,'amount' => $item->count
                 ]));
             } else {
                 $amount = $summary->get($item->date)['amount'];
                 $summary->get($item->date)->put('amount',$amount + $item->count);
             }
             
             $summary->get($item->date)->put('type'.$item->type,$item->count);
             
             return $summary;
         },collect())
         ->values()
         ->toArray();

您可以签出包含有效代码的implode

,

数据形状与您想要的不完全相同,但是我添加了一些我认为有用的有意义的键。

return DB::table('types')->get(['created_at','type'])
    ->groupBy(fn ($item) => Carbon::parse($item->created_at)->format('Y-m-d'))
    ->map(function ($item,$key) {
        $details = $item->map(fn ($type) => $type->type)
            ->unique()->map(fn ($i) => ['type'.$i => $item->sum(fn ($type) => $i === $type->type ? 1 : 0)]);

        return ['date' => $key,'amount' => $item->count(),'details' => $details];
    });

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...