laravel集合的使用

本人对集合的看法

          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;
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值