本人对集合的看法
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;
}
}