laravel的集合对一个数组的处理很强大,同时也很方便。比如:有这样一种情况,需要把A表的数据根据特定的条件分组查询出来。但是呢,A表特定的条件是以B表中的某个字段为条件的。B表有一百条或者一千条数甚至更多的数据。 正常逻辑是:先查询B表,然后遍历B表的每条数据,再去查询A表。这样做的情况,就是对数据库造成一些压力,因为是循环请求数据库的。B表有多少条数据,就请求多少次数据库。可想而知,如果遇到并发的情况,出现问题的情况很大。
集合的逻辑是:1、先查询到A表的数据 2、然后在查询到B表的数据。 3、循环遍历B表的数据,对A表查询的集合做处理。这样相对来说就会好一点儿。当然,使用集合处理也要根据实际的业务或者场景来定的。个人认为,在A表数据量不大的情况下,可是使用。PHP处理一个数组集合还是很快的,但数组集合数据量不要太多。
下面就来实际操作学习一下,下面会提供整个测试流程的代码。
第一步:获取A表的数据,A表的数据如下。
第二步:打印一下laravel获取数据的结果如下:下面是部分结果,全部是18条数数据。
第三步:打印下一,根据指定条件对集合的检索。添加就是,指定 今日头条 然后根据 hour 和 event_date分组。 结果如下:
第四步:可以看出,第三步中12小时里面对应的有 2020-09-04 和 2020-09-03 的数据,如果想分别取出怎么办,如下:
1、先根据12获取数组指定下标的值,然后在将获取的集合根据 event_date 分组即可。
2、打印下一结果如下所示:
TestController控制器的代码如下
<?php namespace App\Http\Controllers; use App\Entities\DwsHourDayData; use App\Entities\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class TestController extends Controller { /** * laravel集合的使用 */ public function index(){ //获取测试表的数据 $nowDate = date('Y-m-d', time()); $nowHour = date('H', time()); $yesterday = date("Y-m-d", strtotime("-1 day")); $inOneHourDate = date('H', strtotime("-1 hour")); $dwsHourDataInfo = $this->getDwsHourDayData($nowDate,$nowHour,$yesterday); //利用集合取出指定媒体的数据 $dwsHourDataInfo = $dwsHourDataInfo->where('media_name','今日头条')->groupBy('hour','event_date'); // print_r($dwsHourDataInfo->toArray());die; //在小时和日期分组的集合上,再取出指定小时的数据 $hourData = $dwsHourDataInfo['12']; // print_r($hourData->toArray());die; //在指定小时的数据之上,再根据日期分组,因为小时里面包含昨天和今天的数据 $todayData = $hourData->groupBy('event_date'); // print_r($todayData->toArray()); //在获取指定日期的数据 $todayInfo = $todayData[$nowDate]; } /** * 获取A表的数据 * @param string $nowDate [当前年月日] * @param string $nowHour [当前小时] * @param string $yesterday [昨天年月日] * @return object $dwsHourDataInfo [查询到的数据] */ private function getDwsHourDayData($nowDate, $nowHour, $yesterday) { //需要求和的字段 $select = [ 'sum(inlet_uv) as inlet_uv', 'sum(uv) as ad_uv', 'sum(cost) as cost', 'sum(rebate_execution_amount) as income_amount', ]; //根据event_date和hour分组 $groupBy = [ 'media_name', 'ad_name', 'event_date', 'hour', ]; $selectResult = array_merge($select, $groupBy); $dwsHourDataInfo = User::select(DB::Raw(join(',', $selectResult))) ->whereIn('event_date', [ $nowDate, $yesterday ]) ->where('hour', '<=', $nowHour) ->groupBy($groupBy) ->get(); return $dwsHourDataInfo; } }
